2010-10-07 65 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