Установка default_scope в соответствии с некоторыми критериями - PullRequest
1 голос
/ 17 апреля 2010

Я пытаюсь установить область по умолчанию в соответствии с некоторыми критериями, определенными 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 ]

1 голос
/ 17 апреля 2010

Вы устанавливаете @ 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
0 голосов
/ 17 апреля 2010

Попробуйте один 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

Нет, хотя проверить.

...