gpt4 book ai didi

ruby-on-rails - rails 3 has_many :through record save error

转载 作者:行者123 更新时间:2023-12-04 16:02:19 26 4
gpt4 key购买 nike

我不确定我的问题是什么,所以这个问题可能需要更多的澄清,但这里似乎是最相关的:

我有一个 has_many :through并且连接模型有一些不是外键的字段。当我构建模型并尝试保存时,我在连接模型的非外键字段上收到验证错误。

我的文件看起来像:

Person.rb

has_many :wedding_assignments, :dependent => :destroy
has_many :weddings, :through=>:wedding_assignments
accepts_nested_attributes_for :weddings
accepts_nested_attributes_for :wedding_assignments

Wedding.rb

has_many :wedding_assignments, :dependent => :destroy
has_many :people, :through=>:wedding_assignments
accepts_nested_attributes_for :people
accepts_nested_attributes_for :wedding_assignments

WeddingAssignment.rb

belongs_to :person
belongs_to :wedding
validates_presence_of :role, :person, :wedding

(角色是一个字符串)
people_controller.rb

def new
@person = Person.new

1.times do
wedding = @person.weddings.build
1.times do
assignment = wedding.wedding_assignments.build
assignment.person = @person
assignment.wedding = wedding
end
end
end

def create
@person = Person.new(params[:person])
@person.weddings.each do |wedding|
wedding.wedding_assignments.each do |assignment|
assignment.person = @person #i don't think I should need to set person and wedding manually, but I get a validation error if I don't
assignment.wedding = wedding
end
end
end

返回的参数如下所示:
{"first_name"=>"", "last_name"=>"", "weddings_attributes"=>{"0"=>{"wedding_assignments_attributes"=>{"0"=>{"role"=>"Bride's Maid", "budget"=>""}}, "date"=>"", "ceremony_notes"=>""}}}

确切的错误是:
ActiveRecord::RecordInvalid in PeopleController#create
Validation failed: Role can't be blank

这显然不正确,因为您可以在 params[] 中看到它

我究竟做错了什么?

这是 rails 3.0.0

最佳答案

是的,这有点猜测,所以如果我最终在这里浪费你的时间,我很抱歉......

在我看来,在您的 create 方法中,您正在创建“婚礼”关系(这实际上只是一种“假装”关系,是否使用 :through => :wedding_assignments),然后返回它。然后,您要求 rails 在调用 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

这应该确保所有内容都以正确的顺序创建,并且 ID 在正确的时间可用等。不幸的是,它比您的示例更复杂,并且确实意味着您将难以支持多个婚礼。

希望这会有所帮助,并且不会成为死胡同。

关于ruby-on-rails - rails 3 has_many :through record save error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com