Как сделать ActiveRecord bump updated_at в новой ассоциации has_many
При добавлении записей в ассоциацию has_many
и сохранение родительского элемента, этот родительский элемент updated_at
не набит:
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">
Это имеет смысл, beacause Order
он не коснулся; внешний ключ живет на LineItem
.
Однако в этом случае я хотел бы запросить Order
и найти только Order
, которые получили последние LineItem
за последние 30 минут (т.е. были обновлены за последние 30 минут).
Я не уверен, что лучше делать здесь, и как я мог бы достичь этого легко. Есть ли какой-то флаг или метод, который я мог бы установить, чтобы AR обновлял родительские updated_at
, как описано? Или я должен сделать это через какой-то крючок? Если да, то какой крюк? Или я должен хранить эту метку времени в другом столбце?
Обратите внимание, что я могу запросить line_items.updated_at
trough a join(:line_items)
, но это, вероятно, сделает мой код более загроможденным и менее эффективным: или это предпочтительный способ для таких проблем в Rails?
Ответы
Ответ 1
Вам нужно включить touch: true
вместе с ассоциацией belongs_to :order
.
class Order < ActiveRecord::Base
has_many :line_items
end
class LineItem < ActiveRecord::Base
belongs_to :order, touch: true
end
Это обновит столбец updated_at
для соответствующего порядка. Подробнее docs здесь
Ответ 2
Вы можете использовать опцию touch, как показано ниже.
class LineItems < ActiveRecord::Base
belongs_to :order, :touch => true
...
end
Это обновит "update_at" родительского порядка всякий раз, когда лимит будет сохранен или уничтожен.
Цитата из http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html,
: нажмите
If true, the associated object will be touched (the updated_at/on attributes set to now) when this record is either saved or destroyed.
Если вы укажете символ, этот атрибут будет обновлен с помощью текущее время в дополнение к атрибуту updated_at/on.