2014-04-14 135 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