2016-09-07 2 views
0

Je suis sur les rails 3.2.21, la version de ruby ​​est 2.0est-il possible d'avoir une portée par défaut conditionnelle dans les rails?

Mon exigence est d'avoir une portée par défaut conditionnelle basée sur les rôles pour un modèle particulier. par exemple

considèrent variable rôle comme un attribut de l'utilisateur connecté

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

rôle est une variable de classe ou quoi? –

+0

Considérez le rôle comme un attribut de l'utilisateur connecté – srikant

+1

Il semble que ce soit un très mauvais motif. Qu'en est-il des gemmes comme CanCan? – Aleksey

Répondre

1

Rien est impossible dans la programmation.

L'utilisation de default_scope est une mauvaise idée en général (beaucoup d'articles sont écrits sur le sujet).

Si vous insistez sur l'utilisation de atribute de l'utilisateur actuel, vous pouvez le transmettre comme argument à la portée:

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

Et puis utilisez comme suit:

Model.based_on_role(current_user.role) 

Sidenote: Rails 3.2.x - sérieux? ...

+0

Envisagez d'utiliser 'case role' sur spaghetty' 'spaghetty. BTW, vous avez une faute de frappe dans 'elsif'. – mudasobwa

+0

@mudasobwa yep, pensé à 'case role', mais juste copié ce que l'auteur avait dans OP. –

+0

Également, évalué dynamiquement 'lambda' diffère de l'implémentation statique par OP. – mudasobwa

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

Aussi, s'il vous plaît lire la réponse par Andrey Deineko, en particulier la partie sur les portées par défaut usag e.

+0

Je pense qu'il va juste jeter 'variable indéfinie ou méthode 'rôle' pour Model' –

+0

Encore une fois, comme je l'ai dit dans le commentaire à votre réponse, il y a une différence significative entre les clauses statiques et dynamiques. Celui-ci est statique, il est évalué dans le contexte du modèle une fois. – mudasobwa