Ответ 1
with_exclusive_scope
- protected
, поэтому вам нужно создать метод класса:
def self.include_deleted_in
Event.with_exclusive_scope { yield }
end
то в вашем контроллере вызовите
Post.include_deleted_in { Post.find(:all) }
В моей модели Post.rb у меня есть default_scope :conditions => {:deleted => 'false'}
Но если я попытаюсь запустить Post.find(:all, :conditions => "deleted='false'")
, он ничего не вернет. Как будто default_scope имеет приоритет над всем.
Я хочу, чтобы, когда я делаю Post.find()
, он не возвращает удаленные сообщения, но я также хотел бы иметь доступ к ним, если мне нужно. Что нужно изменить в моем запросе или моей модели Rails?
Спасибо.
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
Кредит идет на José Valim для этого.
использовать 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.