2012-01-06 1 views
6

ActiveRecordを変更して、常に列のセットが制限されるようにする方法。裏付けされたテーブルのすべての列がモデルに表示されないようにします。これにより、ActiveRecordのメモリフットプリントとレコード照会にかかる時間が不必要に長くなります。ActiveRecordで表される列を制限する

select(ar.rubyonrails.org/classes/ActiveRecord/Base)のような属性を使用すると、わずかな列しか選択できません。しかし、ActiveRecordに、常に:selectを指定せずに検索を実行することを念頭に置いて、これらの列を決して照会しないようにする方法はありますか?

答えて

9

使用default_scope

例えば

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

    ... 
end 
+0

感謝を。デフォルトのスコープがサポートされていることを知っていませんでした – jVenki

+0

'default_scope'は、通常の' scope'のようなリレーショナルメソッドとラムダの任意の組み合わせを取るでしょう –

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">] 
関連する問題