Установка default_scope в соответствии с некоторыми критериями
Я пытаюсь установить область по умолчанию в соответствии с некоторыми критериями, определенными ActionController before_filter. В контроллере:
before_filter :authorize
...
def authorize
if some_condition
@default_scope_conditions = something
elsif another_condition
@default_scope_conditions = something_else
end
end
Внутри ActiveRecord
default_scope :conditions => @default_scope_conditions
Но это, похоже, не работает, фильтр before вызывается, а default_scope не устанавливается. Не могли бы вы сообщить мне, что я делаю неправильно и как это исправить, или предложить какой-то другой способ достижения этого.
2 ответа
Вы устанавливаете @default_scope_conditions - переменную экземпляра из контроллера и ожидаете прочитать ее из модели. Он не виден из модели, если не передан в качестве параметра метода.
Более того, этот подход нарушил бы принцип MVC, который отделяет логику модели от логики контроллера: ваша модель не должна автоматически получать доступ к информации о текущем состоянии контроллера.
Что вы можете сделать: использовать анонимные области.
def scope_user
if some_condition
@default_scope_conditions = something
elsif another_condition
@default_scope_conditions = something_else
end
@user_scoped = User.scoped(:conditions => @default_scope_conditions)
end
Затем в вашем методе вы можете:
def my_method
users = @user_scoped.all
end
или же
def my_method
User.with_scope(:conditions => @default_scope_conditions) do
# ..
@users = User.all #users get scoped
@products.users # also gets scoped
end
end
Попробуйте один default_scope и переопределите его с помощью обычного поиска.
Параметры по умолчанию всегда могут быть переопределены с помощью пользовательского поиска.
class User < ActiveRecord::Base
default_scope :order => '`users`.name asc'
end
User.all # будет использовать область по умолчанию. User.all(:order => 'name desc') # будет использовать переданный в опции order.
Тогда вы можете попробовать что-то вроде следующего
before_filter :authorize
...
def authorize
if some_condition
@order = '' # default scope
elsif another_condition
@order = something_else
end
end
def method_name
User.all(:order => @order)
end
Не проверять, хотя.