2013-04-18 11 views
19

Dodając zapisy do stowarzyszenia has_many i zapisywanie rodzica, że ​​rodziców updated_at nie wpadł:jak uczynić ActiveRecord wpadać updated_at na nowego stowarzyszenia has_many

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"> 

Ma to sens, beacause Order nie dotknął; klucz obcy mieszka na LineItem.

Jednak w tym przypadku, chciałbym kwerendy Order i najtańszą Order s, które otrzymaliśmy nowe LineItem s w ciągu ostatnich 30 minut (czyli: byli „zaktualizowane” w ciągu ostatnich 30 minut).

Nie jestem pewien, co najlepiej tu zrobić i jak mogę to łatwo osiągnąć. Czy jest jakaś flaga lub metoda, którą mógłbym ustawić na aktualizację AR dla rodziców updated_at jak opisano? Czy powinienem to zrobić przez jakiś hak? Jeśli tak, to jaki hak? Czy powinienem przechowywać ten znacznik czasu w innej kolumnie?

Zauważ, że mógłbym przetestować line_items.updated_at przez join(:line_items), ale to prawdopodobnie spowodowałoby, że mój kod byłby bardziej zagracony i mniej wydajny: czy jest to preferowany sposób na takie problemy w Railsach?

Odpowiedz

32

Należy dołączyć touch: true wraz ze skojarzeniem belongs_to :order.

class Order < ActiveRecord::Base 
    has_many :line_items 
end 


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

To będzie aktualizować kolumnę updated_at dla powiązanej kolejności. Więcej dokumentów here

3

Możesz użyć opcji dotykowej, jak pokazano poniżej.

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

Spowoduje to aktualizację "update_at" rodzica zamówienia, gdy element lineitem zostanie zapisany lub zniszczony.

Cytując http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html,

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. 

Jeśli podasz symbol, że atrybut będzie aktualizowany z aktualnym czasem oprócz updated_at/na atrybut.

Powiązane problemy