如何在 1 次调用中在 Rails 中查找和更新或创建对象?

mar*_*ion 0 ruby ruby-on-rails ruby-on-rails-5

所以我试过这个:

stock = Stock.find_or_create_by(ticker: ticker, jse_link: link, name: name, price: price)
Run Code Online (Sandbox Code Playgroud)

事实证明,如果 ActiveRecord 找不到Stock匹配所有 4 个属性的对象,它会创建一个新对象。因此,如果它找到与 4 个属性中的 3 个匹配的对象,则会创建一个重复的属性。

有没有一种简单的方法,而不必使用if语句在 1 次调用中完成所有这些操作?

即我想做的是:

  • 找到Stock匹配的对象ticker: ticker
  • 如果该Stock对象存在,那么我想更新price: price.
  • 如果该Stock对象不存在,那么我想创建一个具有这 4 个属性 ( ticker: ticker, jse_link: link, name: name, price: price)的新对象。

我可以在不使用条件语句的情况下执行上述操作吗?

Son*_*ang 6

您可以使用find_or_initialize_bytap

Stock.find_or_initialize_by(ticker: ticker).tap do |stack|
  stack.price = price
  if stack.new_record?
    stack.jse_link = link
    stack.name = name
  end
  stack.save
end
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为您需要编写 if 或 else,因为您需要创建和更新不同的参数。

stack = Stock.exists?(ticker: ticker) ? Stock.where(ticker: ticker).update(price: price) : Stock.create!(ticker: ticker, jse_link: link, name: name, price: price)
Run Code Online (Sandbox Code Playgroud)