2014-04-14 64 views
0

添加has_and_belong_to_many實體我有兩個型號:使用靜態方法

class Candidate < ActiveRecord::Base 
    has_and_belongs_to_many :skills 
end 

class Skill < ActiveRecord::Base 
    has_and_belongs_to_many :candidates 

    def self.add 
     find_or_create_by(name:"management") 
    end 
end 

下面的執行似乎很好地工作:

>current_candidate.skills.count 
=> 0 
>current_candidate.skills.find_or_create_by(name:"mathematics") 
=> ... 
>current_candidate.skills.count 
=> 1 

但這裏是當我使用靜態方法add發生什麼事:

>current_candidate.skills.count 
=> 0 
>current_candidate.skills.add 
=> ... 
>current_candidate.skills.count 
=> 0 

創建技能management,但不是bi隸屬於我的候選人實體。 我不明白爲什麼靜態方法不考慮current_candidate

PS:這與運行良好的直接結合(如的has_many和belongs_to的)

+0

什麼樣的候選實體?你必須在add方法中傳遞它,然後在add方法中設置find_or_create_by屬性 –

回答

0

新的答案(前面的答案被刪除):

您的代碼將無法工作,因爲你已經定義add作爲一個類的方法的SkillSkill與候選人沒有關係。 Skill實例確實與候選人有關係。

所以要解決這個問題,我認爲在Candidate上添加add_skill方法更有意義,並刪除Skill中的方法。

class Candidate < ActiveRecord::Base 
    has_and_belongs_to_many :skills 

    def add_skill(skill_name) 
    skills.find_or_create_by(name: skill_name) 
    end 
end 

用法:

current_candidate.add_skill('a_skill') 

正如我在前面的回答說,你可能要更換find_or_create_by調用與一聲版本find_or_create_by!趕上(驗證)的錯誤。

+0

無效,他'candidates_skills'表中沒有關係創建。 –

+0

啊,我忽略了一些重要的東西。答案已更新。 – zwippie