使用静态方法添加has_and_belong_to_many实体

时间:2014-04-14 16:18:25

标签: ruby-on-rails-4 static

我有两种模式:

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已创建,但未绑定到我的候选实体。 我不明白静态方法为什么不考虑current_candidate

PS:它适用于直接绑定(如has_many和belongs_to)

1 个答案:

答案 0 :(得分:0)

新答案(删除上一个答案):

您的代码无效,因为您已将add定义为Skill的类方法。 Skill与候选人无关。 Skill实例确实与候选人有关。

为了解决这个问题,我认为在add_skill上添加Candidate方法并删除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!以捕获(验证)错误。