更新或保存实例中的记录

时间:2019-03-14 09:30:47

标签: ruby-on-rails ruby

将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为ID的实例仅更新现有记录,其余的仅另存为新记录?

1 个答案:

答案 0 :(得分:1)

您可以一次查找,更改/创建和保存它

Post.find_or_initialize_by(id: post[:id]).tap do |record|
  record.title = post[:title]
  record.internal_id = post[:internalId]
  record.save
end