限制ActiveRecord中表示的列

时间:2012-01-06 13:23:14

标签: ruby-on-rails activerecord

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

有一些属性,如select(ar.rubyonrails.org/classes/ActiveRecord/Base),可用于仅选择几列。但有没有办法我们可以强制ActiveRecord永远不会查询这些列,尽管用户只是在没有指定:select的情况下执行查找。

2 个答案:

答案 0 :(得分:10)

使用default_scope

e.g。

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

  ...
end

答案 1 :(得分: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">]