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