1

anaActionControllerbefore_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は設定されません。私が間違っていることとそれを修正する方法を教えてください。またはそれを達成するための他の方法を提案してください。

4

2 に答える 2

1

@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
于 2010-04-17T10:23:58.987 に答える
-1

1つのdefault_scopeを試して、customefinderを使用してオーバーライドします。

デフォルトのオプションは、カスタムファインダーを使用していつでもオーバーライドできます。

class User < ActiveRecord::Base
  default_scope :order => '`users`.name asc'
end

User.all#デフォルトのスコープを使用しますUser.all(:order =>'name desc')#passedinorderオプションを使用します。

次に、次のようなことを試すことができます

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

ただし、チェックはありません。

于 2010-04-17T10:20:33.813 に答える