2013-04-18 7 views
19

Beim Hinzufügen von Datensätzen in einem has_many Verband und Speichern der Eltern machen stoßen, updated_at ist, dass Eltern nicht angestoßen wird:, wie Active updated_at auf neue has_many Verein

order = Order.new 
order.save 
pp order 
    => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09"> 
order.line_items << LineItem.new() 
pp order.line_items 
    => [#<LineItem id: 4, order_id: 3, created_at: "2013-04-18 15:26:16", updated_at: "2013-04-18 15:26:29", product_id: 123>] 
order.save 
pp order.reload 
    => #<Order id: 3, created_at: "2013-04-18 15:25:09", updated_at: "2013-04-18 15:25:09"> 

Dies macht Sinn, beacause Order es nicht berührt; der fremde Schlüssel lebt auf dem LineItem.

jedoch in diesem Fall würde Ich mag die Order abfragen und nur Order s finden, die neuen LineItem s in den letzten 30 Minuten erhalten hat (das heißt: Es wurde „aktualisiert“ in den letzten 30 Minuten).

Ich bin nicht sicher, was hier am besten ist, und wie ich das leicht erreichen könnte. Gibt es ein Flag oder eine Methode, die ich einrichten könnte, um AR die Eltern updated_at wie beschrieben zu aktualisieren? Oder sollte ich das über einen Haken machen? Wenn ja, welcher Haken? Oder sollte ich diesen Zeitstempel in einer anderen Spalte speichern?

Beachten Sie, dass ich die line_items.updated_at durch eine join(:line_items) abfragen konnte, aber das würde wahrscheinlich meinen Code überladen und weniger performant machen: oder ist das der bevorzugte Weg für solche Probleme in Rails?

Antwort

32

Sie müssen touch: true zusammen mit belongs_to :order Zuordnung einschließen.

class Order < ActiveRecord::Base 
    has_many :line_items 
end 


class LineItem < ActiveRecord::Base 
    belongs_to :order, touch: true 
end 

Dies wird die updated_at Spalte für die zugehörige Bestellung aktualisieren. Weitere Dokumentation

3

Sie können die Touch-Option verwenden, wie unten gezeigt.

class LineItems < ActiveRecord::Base 
    belongs_to :order, :touch => true 
    ... 
end 

Dies aktualisiert die "update_at" der übergeordneten Reihenfolge, wann immer die Zeile Item gespeichert oder zerstört wird.

von http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html Zitiert,

: touch

If true, the associated object will be touched (the updated_at/on attributes set to now) when this record is either saved or destroyed. 

Wenn Sie ein Symbol angeben, das Attribut wird mit der aktuellen Zeit zusätzlich zu dem updated_at/auf Attribut aktualisiert werden.

Verwandte Themen