Rails 5 - 如何将 find_or_create_by() 方法拆分为两个操作?
Rails 5 - How Do You Split The find_or_create_by() Method Into Two Operations?
我从 PHP 背景来到 Ruby / Rails。我有一个看起来像这样的操作:
MyModelObject.find_or_create_by(user: object.provider)
在 Laravel 中,我或多或少可以通过调用来做同样的事情:
$user = MyModelObject::firstOrCreate(array(
'id' => $user['id'],
'name' => $user['name']
));
在这种情况下,我想将上面的 Laravel Eloquent 调用拆分为:
$user = MyModelObject::find($user['id']);
if(is_null($user)){
$user = MyModelObject::create(array(
'id' => $user['id'],
'name' => $user['name']
));
}
在 Rails 上的 Ruby 中将此调用分成两部分相当于什么?
find_or_create_by
接受一个块,您可以在其中定义属性以分配给不用于查找记录的新记录。在这种情况下,您的代码可能如下所示:
user =
User.find_or_create_by(id: 123) do |user|
user.name = 'Example'
end
(123
和 'Example'
是占位符。)
这将尝试查找 id
为 123
的 User
记录;如果找不到,它将创建一个新的 User
记录,id
为 123
,name
为 'Example'
。
使用 create_with 将新记录的属性与您用来查找记录的属性分开传递:
User.create_with(name: params[:name])
.find_or_create_by(id: params[:id])
我从 PHP 背景来到 Ruby / Rails。我有一个看起来像这样的操作:
MyModelObject.find_or_create_by(user: object.provider)
在 Laravel 中,我或多或少可以通过调用来做同样的事情:
$user = MyModelObject::firstOrCreate(array(
'id' => $user['id'],
'name' => $user['name']
));
在这种情况下,我想将上面的 Laravel Eloquent 调用拆分为:
$user = MyModelObject::find($user['id']);
if(is_null($user)){
$user = MyModelObject::create(array(
'id' => $user['id'],
'name' => $user['name']
));
}
在 Rails 上的 Ruby 中将此调用分成两部分相当于什么?
find_or_create_by
接受一个块,您可以在其中定义属性以分配给不用于查找记录的新记录。在这种情况下,您的代码可能如下所示:
user =
User.find_or_create_by(id: 123) do |user|
user.name = 'Example'
end
(123
和 'Example'
是占位符。)
这将尝试查找 id
为 123
的 User
记录;如果找不到,它将创建一个新的 User
记录,id
为 123
,name
为 'Example'
。
使用 create_with 将新记录的属性与您用来查找记录的属性分开传递:
User.create_with(name: params[:name])
.find_or_create_by(id: params[:id])