Подтвердить что ты не робот

Find_or_initialize_by не работает с 2 столбцами

Я пытаюсь вставить данные в свою базу данных с помощью ActiveRecord.

Когда я использую pdays = MyModel.new для инициализации, а не ниже find_or_initialize_by, script работает нормально. Но он ТОЛЬКО работает один раз. Мне нужно, чтобы это выполнялось ежедневно, чтобы выполнять обновления. Когда я пытаюсь запустить script во второй раз с pdays = MyModel.new, тогда не создается дублирующее ограничение ключа.

Следовательно, я пытаюсь найти ниже find_or_initialize_by с двумя аргументами, но это дает ошибку:

undefined метод `find_or_initialize_by '

2 столбца вместе образуют уникальную запись:

vertica_traffic.each do |vdays|

  pdays = MyModel.find_or_initialize_by([:local_dt], vdays[:community_id])

  pdays[:local_date]       = vdays_traffic[:local_d]
  pdays[:community_id]     = vdays_traffic[:community_id]
  pdays[:uniquesters]      = vdays_traffic[:uniques]

  pdays.save

end
4b9b3361

Ответ 1

Вы можете попробовать:

MyModel.find_or_initialize_by_local_dt_and_comunity_id([:local_dt], vdays[:community_id])

добавление имен столбцов с помощью _and_

Ответ 2

Если вы используете рельсы 3.2.1 и выше, новое имя метода first_or_initialize. Он используется вместе с where. В вашем случае, поскольку вы вызываете сохранение, вы должны использовать first_or_create, но если вы хотите вручную вызвать save, просто замените метод и вызовите сохранение после

MyModel.where(local_date: vdays_traffic[:local_date], community_id: vdays_traffic[:community_id]).first_or_create do |record|
  record.uniquesters = vdays_traffic[:uniques]
end

Ответ 3

Я читал здесь, что в Rails 4 это правильный синтаксис:

Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id)