Переопределение default_scope в Rails
В моей модели Post.rb у меня есть default_scope :conditions => {:deleted => 'false'}
Но если я попытаюсь бежать Post.find(:all, :conditions => "deleted='false'")
, это ничего не вернет. Как будто default_scope имеет приоритет над всем.
Я хочу, чтобы, когда я делаю Post.find()
он не возвращает удаленные сообщения, но я также хотел бы иметь возможность получить к ним доступ, если потребуется. Что необходимо изменить в моем запросе или в моей модели Rails?
Благодарю.
4 ответа
with_exclusive_scope
является protected
Итак, вы должны создать метод класса:
def self.include_deleted_in
Event.with_exclusive_scope { yield }
end
тогда в вашем контроллере вызов
Post.include_deleted_in { Post.find(:all) }
Этот был как-то скрыт:)
Просто используйте Post.unscoped.where(:deleted => true)
, если вы используете Rails 3
За это следует отдать должное Хосе Валиму.
Использовать with_exclusive_scope
Post.with_exclusive_scope { Post.find(:all) }
Области предназначены для компоновки, то есть вы можете комбинировать их несколько, и это эффективно применяет все условия. В этом случае ActiveRecord слишком наивен, чтобы определить, что явное условие должно отменять первое. Он просто строит запрос, объединяя все предложения с AND. По этой причине в default_scope больше всего полезностей с предложениями:order, которые нельзя компоновать (в любом случае в реализации ActiveRecord 2.3). Здесь есть больше дискуссий.
Также обратите внимание, что в Rails 3 ActiveRecord использует Arel для построения большого количества запросов, что значительно увеличит мощность генерации запросов ActiveRecord, упрощая при этом множество внутренних компонентов. Вполне вероятно, что с Арелом улучшит вашу ситуацию. Тем временем я рекомендую не помещать условия в default_scope, если нет строк, которые вы действительно хотите сделать невидимыми для вашего приложения Rails.