2012-01-06 7 views
6

Cómo cambiar ActiveRecord para que siempre tenga un conjunto restringido de columnas. No quiero que todas las columnas en la tabla retrocedida se presenten en el Modelo. Esto abota innecesariamente la huella de memoria de ActiveRecord, así como el tiempo necesario para consultar el registro.Restringir las columnas representadas en ActiveRecord

Hay atributos como select (ar.rubyonrails.org/classes/ActiveRecord/Base) que se pueden usar para SELECCIONAR solo algunas columnas. Pero, ¿hay alguna manera de forzar a ActiveRecord a que nunca consulte esas columnas a pesar de que el usuario realice la búsqueda sin especificar :select todo el tiempo?

Respuesta

9

uso default_scope

por ejemplo

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

    ... 
end 
+0

Gracias. No sabía que el valor predeterminado es compatible con seleccionar también – jVenki

+0

'default_scope' tomará cualquier combinación de métodos relacionales y lambdas como un' scope' normal –

2

no se puede hacer con un ámbito de aplicación:

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">] 
Cuestiones relacionadas