我在以下模型中使用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不创建新的技能记录?
答案 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?