Ruby on rails Mongoid can';t保存具有“属于/有多个”关系的文档。循环依赖

Ruby on rails Mongoid can';t保存具有“属于/有多个”关系的文档。循环依赖,ruby-on-rails,ruby,mongoid,mongoid5,Ruby On Rails,Ruby,Mongoid,Mongoid5,我有两个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: :list

我有两个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
如果我通过
\u 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
我甚至不能分配列表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\u中指定反向字段,因此请尝试以下操作:

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
我还将
外键
替换为
的逆键
,因为has\u-many关系更容易让Mongoid猜测外键名:)

然后,检查您指定的验证,您没有包括在您的帖子中,但是如果您首先创建一个列表,您应该能够为它创建一个预订,而不会有任何问题


此外,直接将对象分配给对象也很好,而且通常更容易,因此您可以直接编写
reservation.listing=my_listing

您实际上必须在
inverse\u 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
我还将
外键
替换为
的逆键
,因为has\u-many关系更容易让Mongoid猜测外键名:)

然后,检查您指定的验证,您没有包括在您的帖子中,但是如果您首先创建一个列表,您应该能够为它创建一个预订,而不会有任何问题


另外,直接将对象分配给对象也很好,而且通常更容易,因此您可以直接编写
reservation.listing=my_listing

谢谢!我能按照你的解决办法解决我的问题。但我确实犯了一个愚蠢的错误,也需要纠正。我正在使用elasticsearch,我定义了一个用于索引的
#listing_id
instance_方法。这与协会的
#listing_id
方法相冲突。。不过我还是解决了<代码>列表_id
由Mongoidː自动生成)谢谢!我能按照你的解决办法解决我的问题。但我确实犯了一个愚蠢的错误,也需要纠正。我正在使用elasticsearch,我定义了一个用于索引的
#listing_id
instance_方法。这与协会的
#listing_id
方法相冲突。。不过我还是解决了<代码>列表_id由Mongoidː自动生成)