2011-01-21 7 views
10

¿Cuál es la mejor manera de actualizar un atributo de modelo dado?Recargar un atributo de modelo

es decir, funcionalmente, quiero esto:

post.body = Post.find(post.id).body 

con una sintaxis más agradable. Tal vez

post.reload_body! 

Editar: sólo quiero volver a cargar una sola atributo (no todos los atributos a la vez)

+0

¿Qué quiere decir ser refrescante un atributo modelo? ¿Cuál es el contexto? – Maz

+0

El título y el contenido de la pregunta son contradictorios. ¿Desea actualizar solo el atributo especificado o está bien actualizarlos? – Heikki

+0

@Heikki: el atributo especificado (actualicé la pregunta para aclarar esto) –

Respuesta

9

me pega por qué te gustaría hacer tal cosa, pero:

def reload_attribute(attr) 
    value = self.class.where(:id=>id).select(attr).first[attr] 
    self[attr] = value 
end 

Esto emite un SELECT que recupera solo una columna y asigna su valor al atributo en la instancia del modelo actual. Llama con (por ejemplo):

post = Post.find(1) 
post.reload_attribute(:body) 

Realmente sin embargo, sólo debe ir con post.reload (doc). A menos que tenga enormemente anchas columnas que imponen algún costo de rendimiento en hacer SELECT *

+0

esto también será un problema si tiene (por ejemplo) accesadores personalizados, etc. – Peter

+1

El caso de uso que veo es para evitar borrar la memoria caché de relaciones también. Si actualizo solo un atributo del objeto, las relaciones ya cargadas no desencadenarán una nueva llamada SQL después. – Mathiou

-1

Carriles 4 tiene una respuesta simple para esta

post.body(reload: true) 

en Rails 5.1 este es

post.reload_body 
+0

No creo que esto funcione con atributos, solo con relaciones (al menos para la sintaxis de Rails 4). – Mathiou