Mongoid 无法保存具有 belongs_to/has_many 关系的文档。循环依赖
Mongoid can't save document with a belongs_to/has_many relationship. Circular dependency
我有 2 个 Mongoid 类:
class Reservation
include Mongoid::Document
belongs_to :listing, class_name: 'Listing', inverse_of: 'Reservation'
end
class Listing
include Mongoid::Document
has_many :reservations, class_name: 'Reservation', foreign_key: :listing_id
end
如果我通过 _id
和 #save!
找到列表,则不会出现错误
listing = Listing.find(...)
listing.save! #=> true
然后我初始化一个新的预订对象:
reservation = Reservation.find_or_initialize_by(params)
reservation.save! #=> error, exptected though, because I didn't set the listing_id yet
Mongoid::Errors::Validations:
message:
Validation of Reservation failed.
summary:
The following errors were found: Listing can't be blank
resolution:
Try persisting the document with valid data or remove the validations.
from /home/ec2-user/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/bundler/gems/mongoid-71c29a805990/lib/mongoid/persistable.rb:78:in `fail_due_to_validation!'
因此我将较早房源的 ID 分配给预订:
reservation.listing_id = listing._id
reservation.listing_id #=> nil
我什至无法分配 listing_id 字段?!
reservation.listing #=> returns the associated document no problem though..
reservation.listing.save! #=> error
Mongoid::Errors::Validations:
message:
Validation of Listing failed.
summary:
The following errors were found: Reservations is invalid
resolution:
Try persisting the document with valid data or remove the validations.
from /home/ec2-user/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/bundler/gems/mongoid-71c29a805990/lib/mongoid/persistable.rb:78:in `fail_due_to_validation!'
没有有效列表无法保存预订,
没有有效预订无法保存房源
这是什么?!?!
请拯救我的一天...
你实际上必须在 inverse_of
中指定逆字段,所以尝试使用类似的东西:
class Reservation
include Mongoid::Document
belongs_to :listing, class_name: 'Listing', inverse_of: :reservations
end
class Listing
include Mongoid::Document
has_many :reservations, class_name: 'Reservation', inverse_of :listing
end
我还用 inverse_of
替换了 foreign_key
用于 has_many 关系,让 Mongoid 猜测外键名称更容易:)
然后,检查您指定的验证并且您没有包含在您的 post 中,但是如果您首先创建一个列表,您应该能够毫无问题地为其创建预订。
另外,直接给对象赋值也可以,而且往往更简单,所以你可以直接写reservation.listing = my_listing
我有 2 个 Mongoid 类:
class Reservation
include Mongoid::Document
belongs_to :listing, class_name: 'Listing', inverse_of: 'Reservation'
end
class Listing
include Mongoid::Document
has_many :reservations, class_name: 'Reservation', foreign_key: :listing_id
end
如果我通过 _id
和 #save!
找到列表,则不会出现错误
listing = Listing.find(...)
listing.save! #=> true
然后我初始化一个新的预订对象:
reservation = Reservation.find_or_initialize_by(params)
reservation.save! #=> error, exptected though, because I didn't set the listing_id yet
Mongoid::Errors::Validations:
message:
Validation of Reservation failed.
summary:
The following errors were found: Listing can't be blank
resolution:
Try persisting the document with valid data or remove the validations.
from /home/ec2-user/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/bundler/gems/mongoid-71c29a805990/lib/mongoid/persistable.rb:78:in `fail_due_to_validation!'
因此我将较早房源的 ID 分配给预订:
reservation.listing_id = listing._id
reservation.listing_id #=> nil
我什至无法分配 listing_id 字段?!
reservation.listing #=> returns the associated document no problem though..
reservation.listing.save! #=> error
Mongoid::Errors::Validations:
message:
Validation of Listing failed.
summary:
The following errors were found: Reservations is invalid
resolution:
Try persisting the document with valid data or remove the validations.
from /home/ec2-user/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/bundler/gems/mongoid-71c29a805990/lib/mongoid/persistable.rb:78:in `fail_due_to_validation!'
没有有效列表无法保存预订, 没有有效预订无法保存房源
这是什么?!?!
请拯救我的一天...
你实际上必须在 inverse_of
中指定逆字段,所以尝试使用类似的东西:
class Reservation
include Mongoid::Document
belongs_to :listing, class_name: 'Listing', inverse_of: :reservations
end
class Listing
include Mongoid::Document
has_many :reservations, class_name: 'Reservation', inverse_of :listing
end
我还用 inverse_of
替换了 foreign_key
用于 has_many 关系,让 Mongoid 猜测外键名称更容易:)
然后,检查您指定的验证并且您没有包含在您的 post 中,但是如果您首先创建一个列表,您应该能够毫无问题地为其创建预订。
另外,直接给对象赋值也可以,而且往往更简单,所以你可以直接写reservation.listing = my_listing