我有一個場景,我從某些ActiveRecord模型生成報告。ActiveRecord基於上下文隱藏列
我在應用程序中有多個角色。根據角色,我想顯示或隱藏某些列。事情是隨着屏幕/頁面數量的增加,跟蹤這些可能會變成一場噩夢。
有沒有辦法在Rails中,我可以停止返回某些列的值取決於某些條件。對於例如我將從ActiveRecord.Where返回的對象將根據用戶角色屏蔽某些列的數據。
我有一個場景,我從某些ActiveRecord模型生成報告。ActiveRecord基於上下文隱藏列
我在應用程序中有多個角色。根據角色,我想顯示或隱藏某些列。事情是隨着屏幕/頁面數量的增加,跟蹤這些可能會變成一場噩夢。
有沒有辦法在Rails中,我可以停止返回某些列的值取決於某些條件。對於例如我將從ActiveRecord.Where返回的對象將根據用戶角色屏蔽某些列的數據。
你可以使用活動記錄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
woot? evel(current_user.role.upcase)?爲什麼dis? –
這將返回ADMIN/USER/MANAGER。如果不寫入eval,它會將ADMIN/USER/MANAGER視爲模型的屬性。嘗試在您的應用程序的控制檯中運行代碼 –
當然,我知道它的作用,但我想知道是否沒有任何其他方式做 –
救它,我真的只是寫了這個答案 - you'll probably benefit from it。
型號
看來,如果你想返回特定ActiveRecord
數據,有一定的方法來限制類建立的屬性。更具體地說,你可以使某些方法「私人」 - 防止你的model
返回它們。
儘管我對此並不是100%確定,但我可以說有兩個「等級」對您的問題 - 數據庫數據&模型的構造。儘管我對ActiveRecord方面沒有任何東西,但是該模型可以「私有化」某些屬性,從而防止它們在應用程序的其他部分可用。
一個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
再次,相當簡陋。我有興趣看到一個更完整的方式來做到這一點。
你可以添加示例代碼嗎? –
爲什麼不簡單調整html視圖/ json響應的呈現以根據用戶的角色顯示所需的屬性? – panmari
無論它發生在哪裏,它都不應該是ActiveRecord--當前用戶和權限是控制器而不是模型問題。 – eirikir