我有一个谷歌眼镜对象和一个处方对象,但是我忘了给谷歌眼镜对象添加时间戳,所以我创建了一个迁移来实现这一点。然而,毫不奇怪,所有的对象都有今天的日期和时间。
glass belongs_to :prescription prescription has_one :glass
但是,我可以从时效对象中获得正确的时间戳。我只是不知道该怎么做。所以我想做这样的事
Glass.update_all(:created_at => self.prescription.created_at)
有什么想法吗?
发布于 2022-05-15 14:54:30
最简单的方法就是简单地进行多个SQL查询,这是一次性迁移,所以我认为没有什么大不了的。ActiveRecord update_all的目的是用相同的值更新匹配的记录,这样就不能工作了。
Glass.all.find_each do |glass|
glass.update!(created_at: glass.prescription.created_at)
end如果您想要一个查询(在sql术语中基于一个名为"update“的连接更新),那么在ActiveRecord (应该在MySQL上工作,而不是在Postgres上) https://github.com/rails/rails/issues/13496中似乎不那么简单,编写原始的https://github.com/rails/rails/issues/13496会更容易--这可以帮助您开始使用https://www.dofactory.com/sql/update-join。
发布于 2022-05-15 15:42:36
您可以使用触摸方法
Prescription.find_each do |prescription|
prescription.glass.touch(:created_at, time: prescription.created_at)
end发布于 2022-10-21 13:02:59
相信我,当我说我在团队“惯用的Rails”中时,迭代每条记录并更新它可能会更加惯用,但是UPDATE FROM..的性能和效率(在资源方面)非常高,除非迁移是在< 1000条记录中迭代,否则我更喜欢执行in UPDATE FROM。
从join执行更新的特定语法将根据您正在运行的SQL实现(Postgres、MySQL等)而有所不同,但通常只需从Rails DB连接执行它。
InboundMessage.connection.execute <<-SQL
UPDATE
inbound_messages
INNER JOIN notifications
ON inbound_messages.message_detail_type = "Notification"
AND inbound_messages.message_detail_id = notifications.id
SET
inbound_messages.message_detail_type = notifications.notifiable_type,
inbound_messages.message_detail_id = notifications.notifiable_id
WHERE
notifications.type = "foo_bar"
SQLhttps://stackoverflow.com/questions/72249260
复制相似问题