我有一个场景,我从某些ActiveRecord模型生成报告。
我在应用程序中有多个角色。根据角色,我想显示或隐藏某些列。事情是随着屏幕/页面的数量增加,保持跟踪这些可能成为一场噩梦。
在Rails中有没有办法,我可以根据某些条件停止返回某些列的值。对于例如我将从ActiveRecord返回该对象。根据用户的角色,某些列的数据将被掩盖。
答案 0 :(得分:1)
您可以使用有效记录select
方法执行此操作。仅选择当前用户角色可以访问并传递给查看的那些属性。
为此,您可以在初始化程序中为特定角色创建可访问的数组。为此,在initializer.rb
下创建一个config/initializers/
文件。添加如下代码:
ADMIN = ['feild1', 'feild2'..., 'feild10']
MANAGER = ['feild1', 'feild2'..., 'feild5']
USER = ['feild1', 'feild2', 'feild3']
在你的行动中写代码如下:
Model.select(eval(current_user.role.upcase))
在视图中,您需要检查已恢复的activerecord中是否存在属性。另外,你会得到ActiveModel::MissingAttributeError:
:
object.has_attribute? 'att_name'
或者你可以用nil来救援它
object.att_name rescue nil
答案 1 :(得分:0)
我真的只是写了一个答案 - you'll probably benefit from it。
<强>模型强>
似乎如果要返回特定的ActiveRecord
数据,有一些方法可以限制类构建的属性。更具体地说,您可以将某些方法设为“隐私” - 阻止您的model
返回它们。
虽然我对此并不是100%肯定,但我可以说你的问题有两个“级别” - 数据库数据&amp;模型的构造。虽然我没有为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
这将覆盖从数据库中提取的属性,允许您确定哪些属性可用。
当然,这是一个非常简陋的程序。
-
<强> 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
再次,非常简陋。我有兴趣看到一种更加综合的方式。