如何缩短rails中的功能?

Jas*_*ngh 0 ruby activerecord ruby-on-rails

我想skill在MySQL表中插入调用skills.

我有skills作为param[:skills] = "Lorem, Ipsum, Is, A, Dummy, Text"

我想将它们插入MySql DB.

我使用的方式是:

def skill_to_add
    skills = params[:skills].split(',')
    skills.each do |s|
        find_skill = Skill.find_by(:skill => s)
        if find_skill
            find_skill.update(:skill_count => find_skill.skill_count + 1)
        else
            Skill.create(:skill => s, :skill_count => 1) 
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

做这件事的干净方法是什么?

sie*_*y22 7

我用find_or_create_by(见文档):

skills.each do |skill_name|
  skill = Skill.find_or_create_by(skill: skill_name)
  skill.increment(:skill_count)
  skill.save
end  
Run Code Online (Sandbox Code Playgroud)

注意:您需要将列设置为整数列,默认值为0,才能正常工作.

我还建议您将技能模型属性重命名为:

Skill
  -> name
  -> count
Run Code Online (Sandbox Code Playgroud)

通常使用它是多余的Skill.skill_count.

Sideote:在线

skills = params[:skills].split(',')
Run Code Online (Sandbox Code Playgroud)

你打算用名字创造空间技能,为什么?

skills = 'Lorem, Ipsum, Is, A, Dummy, Text'.split(',')
skills # => ['Lorem', ' Ipsum', ' Is', ' A', ' Dummy', ' Text']
Run Code Online (Sandbox Code Playgroud)

我想你想剥离分裂的值:

skills = params[:skills].split(',').map(&:strip)
Run Code Online (Sandbox Code Playgroud)