Ruby on rails 访问模型属性的动态范围

Ruby on rails 访问模型属性的动态范围,ruby-on-rails,activerecord,activemodel,Ruby On Rails,Activerecord,Activemodel,我目前正在使用rails 3中的批量分配安全性来确定用户可以更新他们的模型的级别。例如,此代码允许我基于用户级别保护属性 class Customer attr_accessor :name, :credit_rating attr_accessible :name attr_accessible :name, :credit_rating, :as => :admin end 我希望能够使用相同的想法,在查找时显示哪些属性。例如,我想说 Custome

我目前正在使用rails 3中的批量分配安全性来确定用户可以更新他们的模型的级别。例如,此代码允许我基于用户级别保护属性

  class Customer
    attr_accessor :name, :credit_rating

    attr_accessible :name
    attr_accessible :name, :credit_rating, :as => :admin
  end
我希望能够使用相同的想法,在查找时显示哪些属性。例如,我想说

Customer.all.as(:admin) 
并恢复信用评级。将此与实际操作进行比较

Customer.all
并恢复除信用评级以外的所有属性


这是rails支持而我错过的吗?

attr\u accessible用于过滤批量分配的传入属性。这是一个方便的方法,开发人员不需要手动清理传入的参数散列,这是他无法控制的

当显示信息时,开发人员完全可以控制他/她想要显示的内容,因此似乎没有理由限制读取功能

但是,rails允许您在查询中“选择”所需的属性:请参阅

您可以轻松创建一个名为admin的作用域,以限制所选的值

如果您不希望得到完整的模型,而只希望得到值,那么可以使用生成的sql。e:g

ActiveRecord::Base.connection.select_values(Customer.select('name').to_sql)

命名范围是个好主意!这似乎是重复的工作,认为这里是作为用户可写的属性,然后给出一个列表,然后创建一个范围,并说这里是作为用户可读的属性,并给出相同的列表。有什么想法吗?谢谢你的回复--NickAgain,attr_accessible是一种安全构建,用于保护您的模型(层)免受篡改质量分配。在视图层中显示数据完全由您控制,因此不需要模型级安全性。伯特-好主意,我正在考虑您所说的。我担心的是:我有scope:as\u public,select('id,product,price')和attr\u accessible:id,:product,:price,:as=>:public,我担心数据重复。如果在attr\u accessible之后定义范围,您应该能够通过accessible\u attributes(:public)方法获得可访问属性。我不知道它的确切内部工作原理,但从这一点上说,获得它应该不难。但是,再一次,我认为不需要限制您的选择,您可以轻松控制视图层中显示的数据。伯特,再次感谢您的建议。我的视图层有点棘手,因为我只提供json。谢谢