我有两种模式:
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)
答案 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!
以捕获(验证)错误。