gpt4 book ai didi

ruby-on-rails-3 - 使用 update_attributes() 和 has_many 时出现重复记录 :through association

转载 作者:行者123 更新时间:2023-12-03 18:35:28 24 4
gpt4 key购买 nike

我不明白为什么它会生成重复的 recruit_profiles_skills 而不是更新

class RecruitProfile < ActiveRecord::Base
has_many :skills, :through => :recruit_profiles_skills
has_many :recruit_profiles_skills, :dependent => :destroy
accepts_nested_attributes_for :recruit_profiles_skills, :allow_destroy => true

class Skill < ActiveRecord::Base
has_many :recruit_profiles, :through => :recruit_profiles_skills
has_many :recruit_profiles_skills, :dependent => :destroy

参数看起来像

"recruit_profile"=>{
"recruit_profiles_skills_attributes"=>[{"skill_id"=>"1", "level"=>"15"}]
}

然后我做

def update
@recruit_profile.update_attributes(params[:recruit_profile])

但是,这会创建重复的关联记录。为什么这不只是更新!?我可以使用验证来防止重复,但它永远不会更新,因为它只想创建一个新记录,但新记录无效,因为它未通过验证。

最佳答案

我在代码中解决这个问题的方法是:

  1. 在已创建的每个属性中包含关联表中行的“id”。这允许更新按预期工作。
  2. 在 skill_id 属性上使用复选框。因此,如果未选中该复选框,则 skill_id 将不会出现在 params 哈希中。然后,我运行这段代码

<p></p>

params[:recruit_profile][:recruit_profiles_skills_attributes].map{ |rps|
if rps[:skill_id].nil? then rps[:_destroy] = 1 end
}

这段代码将检查是否设置了 :skill_id。如果未设置,则需要删除该行。删除条目的方法,即使 :allow_destroy 设置为 true,也是将 ":_destroy => 1"key=>value 附加到散列。因此,:id 将存在,并且 :_destroy 将存在,因此 update_attributes 将删除它。

执行上述操作将允许创建(:id 不存在,但 :skill_id 存在)、更新(:id 存在和 :skill_id 存在)和销毁(:id 存在,但 :skill_id 不存在)。恕我直言,这不是它应有的工作方式,但仅需 1 行额外代码即可完成工作(由于长度原因分成 3 行)。

(注意:将 skill_id 替换为关联表中的任何其他参数。仅当您使用具有多个属性的关联表时才需要这种循环方式。否则,经典的 collection_ids = [#,#,#]仍然与 has_many 一起工作:通过关联。)

关于ruby-on-rails-3 - 使用 update_attributes() 和 has_many 时出现重复记录 :through association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8098173/

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