【问题标题】:accepts_nested_attributes_for and new recordsAccepts_nested_attributes_for 和新记录
【发布时间】:2010-10-07 11:19:20
【问题描述】:

我将 Accept_nested_attributes_for 与以下模型一起使用:

用户模型:

class User < ActiveRecord::Base

  has_many :competences
  has_many :skills, :through => :competences, :foreign_key => :skill_id

  accepts_nested_attributes_for :skills
end

技能模型:

class Skill < ActiveRecord::Base
  has_many :competences
  has_many :users, :through => :competences, :foreign_key => :user_id
end

能力模型:

class Competence < ActiveRecord::Base
  belongs_to :user
  belongs_to :skill
end

技能表有一个“名称”属性。如果已存在具有相同技能名称的记录,我如何让 Accept_nested_attributes_for 不创建新技能记录?

【问题讨论】:

  • 您找到解决方案了吗?我的技能设置与validates :name, presence: true, uniqueness: true 完全相同。在嵌套属性表单中输入具有相同名称的技能时,出现唯一性验证错误。如果名称匹配,我希望能够使用现有技能。

标签: ruby-on-rails nested-forms nested-attributes


【解决方案1】:

您可以通过验证技能名称的唯一性来避免创建新技能:

class Skill < ActiveRecord::Base
  validates_uniqueness_of :name
end

我猜你真正想知道的是,如何将现有技能与他们为新用户指定的名称相关联,而不是在已有技能时创建新技能。

如果您尝试这样做,它会向我建议属性实际上根本不应该嵌套。

如果您真的想这样做,您可能可以使用before_save 回调来实现,但同样,它有点违背嵌套属性的目的:

class User << ActiveRecord::Base
  before_save :check_for_existing_skill
  def check_for_existing_skill
    if self.skill
      existing_skill = Skill.find_by_name(self.skill.name)
      if existing_skill
        self.skill = existing_skill
      end
    end
  end
end

【讨论】:

  • 我最近试过这个,但我无法让它工作。这种方法仍然可行吗?不使用accepts_nested_attributes_for 的正确方法是什么?
【解决方案2】:

我认为这个问题在这里得到了回答:accepts_nested_attributes_for with find_or_create?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多