ruby-on-rails 找到记录时更新记录或创建新记录

von4xj4u  于 2024-01-09  发布在  Ruby
关注(0)|答案(1)|浏览(143)

在Rails 7中,使用下面的代码,我用传递的email查找user,如果存在就返回它。否则,我用emailrole创建一个新的user

User.create_with(role: params[:role]).find_or_create_by(email: params[:email])

字符串
现在,我需要通过传递的email找到或创建一个user。如果它存在,如果它与作为参数接收的role不同,我需要更新role。例如,假设我在DB中有一个user

{ role: "basic," email: "[email protected]" }


而我得到

params = { role: "basic," email: "[email protected]" }


什么都不需要做。但是,对于用户来说,

{ role: "admin", email: "[email protected]" }


而我得到

params = { role: "basic", email: "[email protected]" }


必须使用basic角色更新用户。

有没有办法在不检索user的情况下实现这一点(就像我在上面创建user时所做的那样)?

我想到的是

User.find_or_create_by(email: params[:email]).update(role: params[:role])


它可以工作,但进行两次写入,updated_atcreated_at不同

fgw7neuy

fgw7neuy1#

最好的方法是在email上有一个DB唯一约束并使用upsert_all,但是如果你不想为此烦恼(或者需要确保回调被触发),那么没有聪明的快捷方法,所以很简单:

User.find_or_initialize_by(email: params[:email]).update(role: params[:role])

字符串

相关问题