Переопределение default_scope в Rails - PullRequest
19 голосов
/ 15 января 2010

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

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

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

Спасибо.

Ответы [ 4 ]

60 голосов
/ 17 октября 2010

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

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

За это идет Хосе Валим за это.

17 голосов
/ 15 января 2010

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

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

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

Post.include_deleted_in { Post.find(:all) }
1 голос
/ 15 января 2010

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

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

1 голос
/ 15 января 2010

использование with_exclusive_scope

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