2016-09-07 130 views
0

我在軌3.2.21,紅寶石版本是2.0是否有可能在rails中有條件的默認範圍?

我的要求是具有基於角色的條件默認範圍爲特定的模型。例如

考慮角色變量作爲登錄的用戶

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 
} 

然後按如下方式使用它:

Model.based_on_role(current_user.role) 

旁註:Rails的3.2.x中 - 嚴重嗎?...

+0

考慮使用'case role'凌亂'如果'spaghetty。順便說一句,你在'elsif'中有一個錯字。 – mudasobwa

+0

@mudasobwa是的,想到'案例角色',但只是複製了作者在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的部分即

+0

我認爲它會拋出'未定義的變量或方法'角色'模型' –

+0

再次,正如我在評論中所說對你的答案來說,靜態和動態從句有明顯的區別。這個是靜態的,它在模型的上下文中被評估過一次。 – mudasobwa