Обновить или сохранить записи из экземпляра - PullRequest
0 голосов
/ 14 марта 2019

Использование Rails 4 с GraphQL API.

Я получаю некоторые входные данные через объект, на основе которых я нахожу или инициализирую новые объекты ActiveRecord, которые я хочу сохранить позже.

Пример ввода:

[
  {:id=>"192", :internalId=>128, :title=>"Editing"},
  {:internalId=>130, :title=>"New"}
]

Как вы можете заметить, некоторые записи уже существуют и имеют ID, нам нужно их обновить.А остальное нам нужно сохранить как новые записи.

Затем у меня есть метод, который просматривает эти значения сообщения:

def posts=(value)
  @posts = value.map do |post|
    init_post(post)
  end
end

def init_post(post)
  Post.find_or_initialize_by(
    id: post[:id],
    title: post[:title],
    internal_id: post[:internalId],
  )
end

, который вернет два экземпляра модели Post:

[#<Post id: 192, title: "Editing", internal_id: 128, created_at: nil, updated_at: nil>, #<Post id: nil, title: "New", internal_id: 130, created_at: nil, updated_at: nil>]

Наконец, я хочу сохранить обе записи:

def save_posts
  posts.each(&:save)
end

, которые будут возвращать:

"#<ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry '192' for key 'PRIMARY': INSERT INTO `posts` ..."

Итак, как мне убедиться, что экземпляры с ID просто обновляютсясуществующую запись, а остальные просто сохранить как новые?

1 Ответ

1 голос
/ 14 марта 2019

Вы можете найти, изменить / создать и сохранить его сразу

Post.find_or_initialize_by(id: post[:id]).tap do |record|
  record.title = post[:title]
  record.internal_id = post[:internalId]
  record.save
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...