【发布时间】:2019-12-01 03:37:05
【问题描述】:
我有 2 个模型:User 和 Purchase。购买属于用户。
class User < ApplicationRecord
has_many :purchases
end
class Purchase < ApplicationRecord
belongs_to :user
enum status: %i[succeeded pending failed refunded]
end
在 Rails 5.2 中,当对没有关联 User 的 Purchase 进行任何修改时,会引发验证错误。这对新购买非常有效,但在尝试保存数据库中不再存在的用户的现有购买数据时也会引发错误。
例如:
user = User.find(1)
# Fails because no user is passed
purchase = Purchase.create(status: 'succeeded')
# Succeeds
purchase = Purchase.create(user: user, status: 'succeeded')
purchase.status = 'failed'
purchase.save
user.destroy
# Fails because user doesn't exist
purchase.status = 'refunded'
purchase.save
我知道我可以通过在购买模型中使用belongs_to :user, optional: true 将关联设为可选来防止第二次更新失败,但这也会取消购买创建的第一次验证。
我也可以为用户关联构建自己的自定义验证,但我正在寻找一种更传统的 Rails 方法来执行此操作。
【问题讨论】:
标签: ruby-on-rails validation activerecord associations