2016-09-09 7 views
0

내가 2 개 Mongoid 클래스가 있습니다몽고 이드는 belongs_to/has_many 관계로 문서를 저장할 수 없습니다. 순환 종속성

을 :

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 

을 발생하지 나는 새로운 예약 obect를 초기화가
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!' 

유효한 나열하지 않고 예약을 저장할 수 없습니다, 이게 뭔지 유효한 예약

없이 목록을 저장할 수 없습니다?!?!

내 하루 저장하세요 ...

답변

1

당신은 실제로 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 

나는 또한 has_many 관계에 대한 inverse_of하여 foreign_key 교체 Mongoid가 외래 키 이름을 추측하도록하는 것이 더 쉽습니다 :)

그런 다음 사용자가 지정한 유효성을 검사하고 게시물에 포함되지 않았지만 처음으로 문제없이 예약을 할 수 있어야합니다. 직접 reservation.listing = my_listing

+0

감사합니다 쓸 수 있도록

또한, 직접 객체를 할당하는 것은, 너무 잘, 그리고 자주 쉽게! 나는 당신의 해결책에 뒤이어 나의 문제를 해결할 수 있었다. 그러나 나는 또한 고칠 필요가있는 끔찍한 실수를했다. 나는 elasticsearch를 사용하고 있으며 인덱싱에 사용되는'# listing_id' instance_method를 정의했습니다. 그건 협회의'# listing_id' 메쏘드와 상충되었습니다. 그러나 해결할 수있었습니다! – Shiyason

+1

'listing_id'는 몽고이드에 의해 자동 생성됩니다 ː) – Geoffroy