2015-09-24 43 views
1

我有一個場景,我從某些ActiveRecord模型生成報告。ActiveRecord基於上下文隱藏列

我在應用程序中有多個角色。根據角色,我想顯示或隱藏某些列。事情是隨着屏幕/頁面數量的增加,跟蹤這些可能會變成一場噩夢。

有沒有辦法在Rails中,我可以停止返回某些列的值取決於某些條件。對於例如我將從ActiveRecord.Where返回的對象將根據用戶角色屏蔽某些列的數據。

+0

你可以添加示例代碼嗎? –

+1

爲什麼不簡單調整html視圖/ json響應的呈現以根據用戶的角色顯示所需的屬性? – panmari

+0

無論它發生在哪裏,它都不應該是ActiveRecord--當前用戶和權限是控制器而不是模型問題。 – eirikir

回答

1

你可以使用活動記錄select方法做到這一點。只選擇當前用戶角色可以訪問並傳遞的屬性。

爲此,您可以在初始化程序中爲可疑角色創建可訪問的字段數組。爲此,在config/initializers/下創建一個initializer.rb文件。添加代碼是這樣的:

ADMIN = ['feild1', 'feild2'..., 'feild10'] 
MANAGER = ['feild1', 'feild2'..., 'feild5'] 
USER = ['feild1', 'feild2', 'feild3'] 

在你的行動寫的代碼是這樣的:

Model.select(eval(current_user.role.upcase)) 

鑑於您需要檢查屬性,在retured的ActiveRecord或不存在。奧瑟維尤你會得到ActiveModel::MissingAttributeError:此:

object.has_attribute? 'att_name' 

或者你可以用零

object.att_name rescue nil 
+0

woot? evel(current_user.role.upcase)?爲什麼dis? –

+0

這將返回ADMIN/USER/MANAGER。如果不寫入eval,它會將ADMIN/USER/MANAGER視爲模型的屬性。嘗試在您的應用程序的控制檯中運行代碼 –

+0

當然,我知道它的作用,但我想知道是否沒有任何其他方式做 –

0

救它,我真的只是寫了這個答案 - you'll probably benefit from it


型號

看來,如果你想返回特定ActiveRecord數據,有一定的方法來限制類建立的屬性。更具體地說,你可以使某些方法「私人」 - 防止你的model返回它們。

儘管我對此並不是100%確定,但我可以說有兩個「等級」對您的問題 - 數據庫數據&模型的構造。儘管我對ActiveRecord方面沒有任何東西,但是該模型可以「私有化」某些屬性,從而防止它們在應用程序的其他部分可用。

enter image description here

一個Rails模型是類 - 填充屬性。這意味着你應該能夠控制哪些屬性可通過與用戶的一部分的作用:

#app/models/role.rb 
class Role < ActiveRecord::Base 
    #columns id | name | attributes | created_at | updated_at 
    #"attributes" can be used to assign an array 
    has_many :users, inverse_of: :role 
end 

#app/models/user.rb 
class User < ActiveRecord::Base 
    belongs_to :role, inverse_of: :users 

    role.attributes.each do |attr| 
     private attr.to_sym 
    end 
end 

這將覆蓋從DB拉的屬性,讓您以確定哪些是可用的。

當然,一個非常基本的程序。

-

ActiveRecord的

解決這個問題的最好辦法,是用的ActiveRecord專門選擇你想要的屬性/列。要做到這一點,我不知道的絕對最好的方法,但也許使用default_scope將是有益的:

#app/models/user.rb 
class User < ActiveRecord::Base 
    belongs_to :role 

    def attributes 
    case role_id 
     when "1" 
     attrs = [] 
     when "2" 
     attrs = [] 
     when "3" 
     attrs = [] 
    end 
    end 
    default_scope (select: attributes) 
end 

再次,相當簡陋。我有興趣看到一個更完整的方式來做到這一點。