2010-10-07 78 views
1

我使用accepts_nested_attributes_for有如下型号: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 

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

+0

你有没有找到这个解决方案?我在技能上有一个与'validates:name,presence:true,uniqueness:true'完全相同的设置。当在嵌套属性表单中输入具有相同名称的技能时,我会得到唯一性验证错误。如果姓名匹配,我希望能够使用现有技能。 – scttnlsn 2014-01-22 17:33:14

回答

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 
+0

我最近试过这个,我无法得到这个工作。这种做法仍然有可能吗?如果不使用'accept_nested_attributes_for',正确的做法是什么? – Kevin 2011-06-19 02:38:28