Nadpisywanie domyślnego zakresu w Rails
W moim poście.model rb, mam default_scope :conditions => {:deleted => 'false'}
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?
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) }
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
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) }
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.
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