Правильно, это немного догадка, поэтому извиняюсь, если я закончу тратить ваше время здесь ...
Мне кажется, что в вашем методе создания вы создаете «свадьбу»отношения (которые на самом деле являются только «притворными» отношениями, они используют: through =>: wedding_assignments), а затем возвращают это.Затем вы просите рельсы воссоздать эти объекты при вызове Person.new.Я предполагаю, что rails запутывается, пытаясь создать объект на противоположной стороне has_many: без присутствия промежуточного объекта.
Я бы немного соблазнился реструктурировать это (непроверенный код!):
def new
@person = Person.new
@wedding = Wedding.new
@wedding_assignment = WeddingAssignment.new
end
def create
@person = Person.new(params[:person])
@wedding = Wedding.new(params[:person])
@assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person}))
end
У меня такое чувство, что это будет работать до последней строки.Я подозреваю, чтобы это работало, вам может понадобиться использовать транзакции:
def create
@person = Person.new(params[:person])
@wedding = Wedding.new(params[:person])
ActiveRecord::Base.transaction do
if @person.valid? && @wedding.valid?
[@person,@wedding].each.save!
@assignment = WeddingAssignment.new(params[:wedding_assignment].merge({:person => @person}))
@assignment.save!
end
end
end
Это должно гарантировать, что все будет создано в правильном порядке, а идентификаторы будут доступны в нужное время и т. Д. К сожалению, этонемного сложнее, чем ваш пример, и это означает, что вы будете бороться за поддержку нескольких свадеб.
Надеюсь, это поможет, и не станет тупиком.