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' 是占位符。)

这将尝试查找 id123User 记录;如果找不到,它将创建一个新的 User 记录,id123name'Example'

使用 create_with 将新记录的属性与您用来查找记录的属性分开传递:

User.create_with(name: params[:name])
    .find_or_create_by(id: params[:id])