【问题标题】:Restrict the columns represented in ActiveRecord限制 ActiveRecord 中表示的列
【发布时间】:2012-01-06 21:52:13
【问题描述】:

如何更改 ActiveRecord 使其始终具有一组受限的列。我不希望后备表中的所有列都出现在模型中。这会不必要地增加 ActiveRecord 的内存占用以及查询记录所花费的时间。

有像 select (ar.rubyonrails.org/classes/ActiveRecord/Base) 这样的属性可以用来选择几列。但是有什么方法可以强制 ActiveRecord 永远不要查询这些列,尽管用户只执行 find 而没有指定 :select

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    使用default_scope

    例如

    class MyModel < ActiveRecord::Base
      default_scope select("column1, column2, column3")
    
      ...
    end
    

    【讨论】:

    • 谢谢。不知道 default_scope 也支持选择
    • default_scope 会像普通的scope 那样采用关系方法和 lambdas 的任意组合
    【解决方案2】:

    你不能用范围做吗:

    IGNORED = %w( id created_at updated_at )
    scope :filtered, lambda { select( cols ) }
    
    def self.cols
      attribute_names = []
      attributes = self.columns.reject { |c| IGNORED.include?( c.name ) }
    
      attributes.each { |attr| attribute_names << attr.name }
      attribute_names
    end
    
    Model.filtered
    [#<Model name: "Test 2", reg_num: "KA 02", description: "aldsfjadflkj">] 
    

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多