从Rails 4升级到Rails 5.2后,我在模型关联方面遇到了一些问题。
我有一个模型事件,其中用户是事件的成员,每个事件都有一个预留,供以后想要参加的用户使用。
# app/models/event.rb
class Event < ApplicationRecord
# Events has many Users through subcsriptions
has_many :subscriptions
has_one :reserve
has_many :users, :through => :subscriptions
...
end
储备型号:
# app/models/reserve.rb
class Reserve < ApplicationRecord
belongs_to :event, optional: true
has_many :subscriptions
has_many :users, :through => :subscriptions
end
订阅模式:
class Subscription < ApplicationRecord
belongs_to :event
belongs_to :reserve
belongs_to :user
end
当我尝试推动用户保留OR事件时:
@event.users << current_user
我有那个错误:
ActiveRecord::RecordInvalid (Validation failed: Reserve must exist):
为什么验证需要预留?很明显,保留是可选的。
ActiveRecord::RecordInvalid (验证失败:保留必须存在(
您可以在belongs_to
中使用optional: true
,如下所示以避免错误。
class Subscription < ApplicationRecord
belongs_to :event
belongs_to :reserve, optional: true
belongs_to :user
end