Подтвердить что ты не робот

Переопределение default_scope в Rails

В моей модели Post.rb у меня есть default_scope :conditions => {:deleted => 'false'}

Но если я попытаюсь запустить Post.find(:all, :conditions => "deleted='false'"), он ничего не вернет. Как будто default_scope имеет приоритет над всем.

Я хочу, чтобы, когда я делаю Post.find(), он не возвращает удаленные сообщения, но я также хотел бы иметь доступ к ним, если мне нужно. Что нужно изменить в моем запросе или моей модели Rails?

Спасибо.

4b9b3361

Ответ 1

with_exclusive_scope - protected, поэтому вам нужно создать метод класса:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

то в вашем контроллере вызовите

Post.include_deleted_in { Post.find(:all) }

Ответ 2

Это было как-то скрыто:)

Просто используйте Post.unscoped.where(:deleted => true), если вы используете Rails 3

Кредит идет на José Valim для этого.

Ответ 3

использовать with_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }

Ответ 4

Скоменты предназначены для того, чтобы быть составными, то есть вы можете комбинировать их и эффективно применять все условия. В этом случае ActiveRecord слишком наивна, чтобы определить, что явное условие должно отрицать первое. Он просто строит запрос, объединяющий все предложения с помощью AND. По этой причине default_scope имеет наибольшую полезность с предложениями: order, которые не являются составными (в любом случае, в реализации ActiveRecord 2.3). Здесь больше обсуждений здесь.

Также обратите внимание, что в Rails 3 ActiveRecord использует Arel для большого количества запросов, что значительно увеличит мощность запроса ActiveRecord при одновременном упрощении многих внутренних компонентов. Скорее всего, с Арелом улучшится ваша ситуация. Тем временем я рекомендую не устанавливать условия в default_scope, если нет строк, которые вы действительно хотите быть невидимыми для вашего приложения Rails.