插入和更新时 Rails 的upsert_all用法



我正在尝试使用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更新了他的角色,并创建了新用户的帐户。

相关内容

  • 没有找到相关文章

最新更新