我正在尝试使用upsert_all
方法同时更新和插入Postgres数据库中的所有记录(来自ActiveRecord模型(。然而,我遇到了一个问题
我首先获取现有记录并更新它们,这是有意义的,因为需要记录ID(它是我的主键(来使用upsert_all
方法更新它
不过,对于新记录,我没有ID,但必须设置一个ID,因为upsert_all
要求所有记录都具有相同的密钥,所以我必须设置ID,并且我认为将其设置为nil
可能会起作用。执行此操作时,我会出现以下错误:PG::NotNullViolation: ERROR: null value in column "id" violates not-null constraint
那么我应该如何在Rails中使用upsert_all
方法呢
是否有一种方法可以指定,如果ID为nil,则绕过该值并由postgres自动递增?
rails文档中的示例应该告诉您需要知道的一切:
# Inserts multiple records, performing an upsert when records have duplicate ISBNs.
# Here "Eloquent Ruby" overwrites "Rework" because its ISBN is duplicate.
Book.upsert_all([
{ title: "Rework", author: "David", isbn: "1" },
{ title: "Eloquent Ruby", author: "Russ", isbn: "1" }
], unique_by: :isbn)
Book.find_by(isbn: "1").title # => "Eloquent Ruby"
所以。。。不,您不需要知道记录的ID。您如何知道尚未创建的记录的ID?但是,您应该指导upsert_all
方法如何通过传递unique_by
来确定要更新的记录。
另一个例子可能是更新一堆用户。是的,他们都会在数据库中有一个ID,但他们也应该有一个唯一的电子邮件或用户名或其他东西:
User.upsert_all([
{ email: "bob@acme.com", role: "manager" },
{ email: "new-user@example.com", role: "customer" }
], unique_by: :email)
在本例中,bob@acme.com
已经存在,但new-user@example.com
不存在。Bob更新了他的角色,并创建了新用户的帐户。