0

我从 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']
    ));
}

在 Ruby on Rails 中将此调用一分为二的等价物是什么?

4

2 回答 2

1

find_or_create_by接受一个块,您可以在其中定义属性以分配给不用于查找记录的新记录。在这种情况下,您的代码可能如下所示:

user =
  User.find_or_create_by(id: 123) do |user|
    user.name = 'Example'
  end

123并且'Example'是占位符。)

这将尝试查找User带有idof的记录123;如果找不到,它将创建一个User带有idof123和 aname的新记录'Example'

于 2021-07-07T23:46:24.383 回答
1

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

User.create_with(name: params[:name])
    .find_or_create_by(id: params[:id])
于 2021-07-08T01:05:08.070 回答