2016-09-07 6 views
0

私はレール上に3.2.21、ルビーバージョンは2.0です条件付きデフォルトスコープをレールに入れることは可能ですか?

私の要件は、特定のモデルのロールベースの条件付きデフォルトスコープです。例えば

if role == 'xyz' 
    default_scope where(is_active: false) 
elsif role == 'abc' 
    default_scope where(is_active: true) 
end 
+0

ロールはクラス変数か何ですか? –

+0

ログインしたユーザーの属性としての役割を考慮する – srikant

+1

非常に悪いパターンのようです。 CanCanのような宝石はどうですか? – Aleksey

答えて

1

何がプログラミングで不可能なことはありませんログインしているユーザーの属性として役割変数を考えます。

default_scopeを使用することは、一般的には悪い考えです(多くの記事がトピックに書かれています)。その後、

scope :based_on_role, lambda { |role| 
    if role == 'xyz' 
    where(is_active: false) 
    elsif role == 'abc' 
    where(is_active: true) 
    end 
} 

そして、次のようにそれを使用します:

あなたは現在のユーザーのatributeを使う、という場合は、スコープの引数として渡すことができ

Model.based_on_role(current_user.role) 

追記:Railsの3.2.xのを - 真剣に... ...

+0

厄介な 'if's spaghettyに' case role'を使うことを検討してください。ところで、あなたは 'elsif'にタイプミスがあります。 – mudasobwa

+0

@mudasobwa yep、 'case role'について考えましたが、作者がOPに持っていたものをコピーしました。 –

+0

また、動的に評価される 'lambda'は静的実装とOPによって異なります。 – mudasobwa

1
default_scope where(
    case role 
    when 'xyz' then { is_active: false } 
    when 'abc' then { is_active: true } 
    else '1 = 1' 
    end 
) 

また、Andrey Deinekoの回答を読んでください。特に、デフォルトの範囲usag e。

+0

私は、モデル ' –

+0

の'未定義の変数またはメソッドの役割 'を投げてしまうと思います。あなたの答えには、静的句と動的句の間には大きな違いがあります。これは静的で、モデルの文脈で一度評価されます。 – mudasobwa

関連する問題