Как сократить функцию в рельсах? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу вставить skill в таблицу MySQL с именем skills.

У меня есть skills как param[:skills] = "Lorem, Ipsum, Is, A, Dummy, Text"

Я хочу вставить их в базу данных MySql.

Способ, которым я пользуюсь:

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

Каким будет чистый способ сделать это?

1 Ответ

0 голосов
/ 01 июня 2018

Я бы использовал 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  

ПРИМЕЧАНИЕ : вам нужно установить столбец в целочисленный столбец с0, как значение по умолчанию, для правильной работы.

Я бы также посоветовал вам переименовать атрибуты вашей модели навыков в:

Skill
  -> name
  -> count

часто это довольно избыточно для использования Skill.skill_count.

Sideote: в строке

skills = params[:skills].split(',')

вы собираетесь создавать навыки с пробелами в названии, почему?

skills = 'Lorem, Ipsum, Is, A, Dummy, Text'.split(',')
skills # => ['Lorem', ' Ipsum', ' Is', ' A', ' Dummy', ' Text']

Я думаю, что вы хотите полосу разделенные значения:

skills = params[:skills].split(',').map(&:strip)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...