Как найти и обновить или создать объект в Rails за 1 вызов? - PullRequest
0 голосов
/ 15 мая 2018

Итак, я попробовал это:

stock = Stock.find_or_create_by(ticker: ticker, jse_link: link, name: name, price: price)

Оказывается, что если ActiveRecord не может найти объект Stock, который соответствует всем 4 атрибутам, он создает новый.Поэтому, если он находит объект, который соответствует 3 из 4 атрибутов, он создает дублирующийся атрибут.

Есть ли простой способ без необходимости использовать операторы if для выполнения всего этого за один вызов?

то есть то, что я хочу сделать, это:

  • Найти Stock объект, который соответствует ticker: ticker.
  • Если этот объект Stock существует, то я хочу обновить price: price.
  • Если этот объект Stock не существует, тогда я хочу создать новый объект с этими 4Атрибуты (ticker: ticker, jse_link: link, name: name, price: price).

Можно ли выполнить вышеизложенное без использования условных операторов?

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Я думаю, вам нужно написать, если или иначе, так как у вас есть другой параметр для создания и обновления.

stack = Stock.exists?(ticker: ticker) ? Stock.where(ticker: ticker).update(price: price) : Stock.create!(ticker: ticker, jse_link: link, name: name, price: price)
0 голосов
/ 16 мая 2018

Вы можете использовать find_or_initialize_by и tap

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
0 голосов
/ 15 мая 2018

что вы можете сделать при объединении запросов:

stock = Stock.where(ticker: ticker).update(price: price).first_or_create(ticker: ticker, jse_link: link, name: name, price: price)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...