accepts_nested_attributes_for和新记录

时间:2010-10-07 11:19:20

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

我在以下模型中使用accepts_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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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