2012-01-06 9 views
6

Come modificare ActiveRecord in modo che abbia sempre un insieme limitato di colonne. Non desidero che tutte le colonne della tabella retroata siano presenti nel modello. Questo indebolisce inutilmente l'ingombro di memoria di ActiveRecord e il tempo necessario per interrogare il record.Limita le colonne rappresentate in ActiveRecord

Ci sono attributi come selezionare (ar.rubyonrails.org/classes/ActiveRecord/Base) che può essere utilizzato per SELEZIONARE solo poche colonne. Ma c'è un modo in cui possiamo forzare ActiveRecord a non interrogare mai quelle colonne, a dispetto del fatto che l'utente esegua semplicemente la ricerca senza specificare :select in ogni momento.

risposta

9

uso default_scope

esempio

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

    ... 
end 
+0

Grazie. Non so che default_scope supportato seleziona anche – jVenki

+0

'default_scope' prenderà qualsiasi combinazione di metodi relazionali e lambda come un normale' scope' sarebbe –

2

non si può fare con un campo di applicazione:

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">] 
Problemi correlati