Альтернатива default_scope в ActiveRecord - PullRequest
4 голосов
/ 03 августа 2011

Я сталкиваюсь с проблемой изменения функциональности приложения и необходимости переписать около 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)

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

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

1 Ответ

0 голосов
/ 03 августа 2011

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

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

User.with_exclusive_scope do
  user.models.baz.where(something)
end
...