Подтвердить что ты не робот

Как сделать 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?

4b9b3361

Ответ 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.