【问题标题】:Dynamic scope for accessing Model Attributes访问模型属性的动态范围
【发布时间】:2011-06-01 23:39:32
【问题描述】:

我目前正在使用 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

并取回除 credit_rating 之外的所有属性

这是 rails 支持但我错过的东西吗?

【问题讨论】:

    标签: ruby-on-rails activerecord activemodel


    【解决方案1】:

    attr_accessible 用于过滤批量分配的传入属性。这是一种方便的方法,开发人员不需要手动清理传入的参数哈希,这是他无法控制的。

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

    但是,rails 允许您在查询中“选择”所需的属性:请参阅http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

    您可以轻松地创建一个名称为 admin 的范围,以限制所选值。

    如果您不想拥有完整的模型,而只想拥有值,则可以使用生成的 sql。例如:例如。

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

    【讨论】:

    • 命名范围是个好主意!似乎重复的努力认为这里是作为用户可写的属性然后给出一个列表然后创建一个范围并说这里是作为用户可读的属性并给出相同的列表。有什么想法吗?感谢您的答复。 --尼克
    • 同样,attr_accessible 是一种安全构建,可保护您的模型(层)免受篡改的质量分配。在视图层显示数据完全由您控制,因此不需要模型级别的安全性。
    • 伯特-很棒的想法,我正在考虑你所说的。这是我的担忧:我有 scope :as_public, select('id, product, price') 和 attr_accessible :id, :product, :price, :as => :public 我担心数据重复。
    • 如果你在 attr_accessible 之后定义你的范围,你应该能够通过accessible_attributes(:public) 方法获得可访问的属性。我不知道它的确切内部工作原理,但从这一点来看应该不难。但是,再一次,我认为不需要限制您的选择,您可以轻松控制视图层中显示的数据。
    • 伯特,再次感谢您的建议。我的视图层有点棘手,因为我只提供 json。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多