Nadpisywanie domyślnego zakresu w Rails

W moim poście.model rb, mam default_scope :conditions => {:deleted => 'false'}

Ale jeśli spróbuję uruchomić Post.find(:all, :conditions => "deleted='false'"), to nic nie zwróci. To tak, jakby default_scope miał pierwszeństwo przed wszystkim.

Chcę, aby kiedy to zrobię Post.find(), nie zwracał usuniętych postów, ale chciałbym mieć do nich dostęp, jeśli będę musiał. Co należy zmienić w moim zapytaniu lub w moim modelu Rails?

Dzięki.
Author: John Topley, 2010-01-15

4 answers

with_exclusive_scope jest protected, więc musisz utworzyć metodę klasy:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

Następnie w wywołaniu kontrolera

Post.include_deleted_in { Post.find(:all) }
 17
Author: bdon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 12:34:07

Ten został jakoś Ukryty:)

Po prostu użyj Post.unscoped.where(:deleted => true), jeśli używasz Rails 3

Za to zasługa José Valima.
 60
Author: edgerunner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-17 19:00:39

Użyj with_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }
 1
Author: semanticart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 17:52:40

Lunety mają być komponowalne, co oznacza, że można połączyć ich kilka i to skutecznie stosuje wszystkie warunki. W tym przypadku ActiveRecord jest zbyt naiwny, aby stwierdzić, że warunek jawny powinien negować pierwszy. To po prostu buduje zapytanie łączące wszystkie klauzule z ANDs. Z tego powodu default_scope ma największą użyteczność z klauzulami: order, które nie są komponowalne (i tak w implementacji ActiveRecord 2.3). Jest więcej dyskusji tutaj .

Zauważ również, że w Rails 3 ActiveRecord używa Arel do budowy wielu zapytań, co znacznie zwiększy moc generowania zapytań ActiveRecord przy jednoczesnym uproszczeniu wielu elementów wewnętrznych. Jest prawdopodobne, że z Arel poprawi twoją sytuację. W międzyczasie polecam nie umieszczać warunków w default_scope, chyba że są wiersze, które naprawdę chcesz być niewidoczny dla Twojej aplikacji Rails.

 1
Author: gtd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 18:13:02