Обновление определенных атрибутов для моделей в Rails 5

Llanod11 спросил: 28 апреля 2018 в 09:05 в: ruby-on-rails

Я очень новичок в рельсах 5 и нуждаюсь в руке с некоторым синтаксисом.

У меня есть две модели Saving и Investment .. Каждое сохранение может иметь многие инвестиции, поэтому соотношение равно 1: m. Обе модели имеют логический атрибут is_autobid.

Я хочу создать задачу rake, которая извлекает все Сбережения, где is_autobid = true, а затем обновляет первые инвестиции определенного Сбережения запись в true .. до сих пор я:

task :update_autobids => :environment do  Saving.where(is_autobid: 1).all.each do |s|    investment = s.investments.first(:is_autobid, 0)
    investment.update(is_autobid = 1)
  end
end

1 ответ

Есть решение
Vishal ответил: 28 апреля 2018 в 09:31

Вы можете использовать update_column для обновления одного столбца, он не будет проверять какие-либо проверки, а вам нужно только обновлять инвестиции, если какая-либо запись найдена

Saving.where(is_autobid: 1).each do |s|
  investment = s.investments.find_by(is_autobid: 0)
  investment.update_column(:is_autobid, 1) if investment
end

Обновить

Если вы хотите сразу загрузить все записи, чем вы можете сделать это с помощью нижеприведенного запроса

investments = Investment.includes(:saving).where("savings.id = (select id from savings where savings.is_autobid = 0 limit 1)").references(:saving)investments.each do |investment|
  investment.update_column(:is_autobid, 1)
end
Llanod11 ответил: 28 апреля 2018 в 09:27
Я собираюсь принять это как верхний ответ, благодаря тому, что задача грабли выполнена правильно, а данные обновлены соответствующим образом в MySQL.
Vishal ответил: 28 апреля 2018 в 09:31
@ Llanod11 Рад узнать, слышу, я обновил ответ, если вам нужна дополнительная информация, пожалуйста, проверьте его :)
Llanod11 ответил: 28 апреля 2018 в 09:33
Прохладный человек приветствует, я видел все это в журналах :)