Ответ 1
Вы можете попробовать:
MyModel.find_or_initialize_by_local_dt_and_comunity_id([:local_dt], vdays[:community_id])
добавление имен столбцов с помощью _and_
Я пытаюсь вставить данные в свою базу данных с помощью 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
Вы можете попробовать:
MyModel.find_or_initialize_by_local_dt_and_comunity_id([:local_dt], vdays[:community_id])
добавление имен столбцов с помощью _and_
Если вы используете рельсы 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
Я читал здесь, что в Rails 4 это правильный синтаксис:
Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id)