class Order < ApplicationRecord
has_one :offer_screenshot
end
class OfferScreenshot < ApplicationRecord
belongs_to :Order
end
这种 has_one
的关系,如果使用
order = Order.find(1)
order.create_offer_screenshot
这里会发生的事情是 rails 会自动帮你把 OfferScreenshot
中的 order_id
设置成 order
的 id
也就是 1
,如果这是第一次创建这个 order
的 OfferScreenshot
,那么只会有一次 insert
的 db
操作。如果之前 这个 order
有了一个 OfferScreenshot
,而现在要重新 create
一个的话,就会有 insert
和 update
两次 db 操作。insert
还是同样的创建一个 order_id = 1
的 OfferScreenshot
,update
则是把原来的 OfferScreenshot
的 order_id
置成 nil
。
所以,如果要在 model 上加 call back 的话,最好加在 after_commit 这样的 db commit 过的操作上,如果只是希望 after_create 而并不需要在 after_update 也 call back 的话,最好不要使用 after_save,因为像这样 order.create_offer_screenshot
就会出现两次 call back(一次 create,一次 update),这样就有可能造成很隐秘的 bug。而更建议的是使用 after_create_commit
而不是 after_create
。

网友评论