Альтернатива default_scope в ActiveRecord

Я столкнулся с проблемой изменения функциональности приложения и необходимости переписывать около 700 вызовов методов, которые теперь необходимо определить.

Я изучал, как default_scope работает, и, как и большинство людей, нахожу, что это близко, но не совсем полезно для меня, потому что я не могу это легко переопределить.

В настоящее время rails предлагает заменить default_scope методом unscoped. Проблема с unscoped в том, что он полностью удаляет всю область, а не только область по умолчанию.

Мне очень хотелось бы получить информацию от гуру Rails / ActiveRecord по некоторым альтернативам.

Учитывая эту базовую желаемую функциональность ...

class Model < ActiveRecord::Base
  ...      
  belongs_to :user
  ...
  default_scope where(:foo => true)
  scope :baz, where(:baz => '123')
  scope :sans_foo, without_default.where(:foo=>true)
  ...
end

Не могли бы вы / как вы могли бы создать метод, который мог бы удалить область действия по умолчанию, оставив при этом другую область видимости нетронутой? IE, в настоящее время, если вы используете ...

user.models.unscoped.where(something)

... это то же самое, что позвонить

Model.where(something)

Можно ли определить метод, который позволил бы вам вместо этого сделать что-то вроде этого ...

user.models.without_default.where(something)

... где результат по-прежнему будет доступен пользователю, но не будет включать область действия по умолчанию?

Я очень, очень признателен за любую помощь или предложения о том, как можно реализовать такую ​​функциональность.


person Andrew    schedule 03.08.2011    source источник


Ответы (1)


Вы должны использовать with_exclusive_scope.

http://apidock.com/rails/ActiveRecord/Base/with_exclusive_scope/class

User.with_exclusive_scope do
  user.models.baz.where(something)
end
person Arun Kumar Arjunan    schedule 03.08.2011
comment
Я думал, что: а) это устарело и б) это то же самое, что и unscoped в Rails 3? - person Andrew; 03.08.2011