2014-07-16 4 views
0

je suis entré dans rails console de ma demande et effectuer les déclarations suivantes:mises à jour update_attribute une seule fois

order = Order.find(2) 
order.update_attribute(:start_at, Time.new) 

ActiveRecord composé suivant l'instruction SQL:

UPDATE orders 
SET 
    start_at = '2000-01-01 14:23:00', 
    updated_at = '2014-07-16 10:30:59' 
WHERE 
    orders.id = 2 

Maintenant, j'execute la même méthode update_attribute à nouveau avec les mêmes paramètres et à nouveau et obtenir

UPDATE orders SET updated_at = '2014-07-16 10:33:52' WHERE orders.id = 2 
UPDATE orders SET updated_at = '2014-07-16 10:34:11' WHERE orders.id = 2 
UPDATE orders SET updated_at = '2014-07-16 10:37:19' WHERE orders.id = 2 

Rien n'est mis à jour sauf champ updated_at!

+1

Y at-il des rappels sur votre modèle 'Order'? – xlembouras

+0

ne se produit pas dans ma console ... bien que j'utilise Rails 4, pourrait être un bug. –

+0

Vous n'avez pas posé de question? FYI: pour ce genre de mise à jour, vous pouvez utiliser 'touch' à la place:' order.touch (: start_at) '. – pdobb

Répondre

0

Certains expliquent les méthodes que vous utilisez (tous de doc):

update_attribute(name, value) <= v2.3.8 

Met à jour un seul attribut et enregistre le record sans passer par la procédure de validation normale.

update_attribute(name, value) >= 4.0.0 

Met à jour un seul attribut et enregistre l'enregistrement. Ceci est particulièrement utile pour les indicateurs booléens sur les enregistrements existants. Notez également que

  • La validation est ignorée.

  • Les rappels sont appelés.

  • La colonne updated_at/updated_on est mise à jour si cette colonne est disponible.

  • mises à jour tous les attributs qui sont sales dans cet objet.

Et ce que vous essayez:

mise à jour uniquement updated_at est mis à jour parce que la colonne est disponible.

order.update_attribute(:start_at, Time.new) 

attributs sales:

order.start_at = Time.new 

nouveau:

order.update_attribute(:start_at, Time.new) 

maintenant start_at colonne mis à jour.

Questions connexes