Я хочу добавить строку, если она не найдена, обновить, если она найдена - PullRequest
0 голосов
/ 27 марта 2020

Следующий код, который правильно вставляет новые строки, если people не найден. Если найден people, я хочу обновить существующую строку, а также import_id, но обновление не работает. Поэтому, если новый импорт содержит те же данные в people, я просто хочу обновить import_id. people имеет name age.

    Person.transaction do
      people.flatten.each do |people|
        Person.create_with({ import_id: import.id, **people }).find_or_create_by(**people)
      end
    end

1 Ответ

1 голос
/ 28 марта 2020

Чтобы переформулировать требования, если элемент в people соответствует Person на name и age, обновите import_id этого человека. Если этот элемент в people не соответствует Person на name и age, создайте новый Person и установите import_id.

Это должно сделать то, что вы ищете.

Person.transaction do
  people = [{ name: 'Tom', age: 20 }, { name: 'Jerry', age: 20 }]
  people.flatten.each do |person|
    Person.find_or_create_by(name: person[:name], age: person[:age])
      .update_attributes(import_id: import.id)
  end
end

Найти или создать человека по требуемым атрибутам, а затем обновить import_id в новой или существующей записи.

find_or_create_by документы

...