在Rails 7中,使用下面的代码,我用传递的email
查找user
,如果存在就返回它。否则,我用email
和role
创建一个新的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_at
与created_at
不同
1条答案
按热度按时间fgw7neuy1#
最好的方法是在
email
上有一个DB唯一约束并使用upsert_all
,但是如果你不想为此烦恼(或者需要确保回调被触发),那么没有聪明的快捷方法,所以很简单:字符串