Видимо, я видел allthosequestions с ответами вроде: «Использовать find_or_create_by
/initialize_by(<cols>)
».Как правильно вставить или обновить запись в рельсах?
И вопрос: «Это только я, или эти ответы немного« сломаны »?» Если вы запрашиваете вставку или обновление, это обычно означает, что записи должны быть уникальными: не должно существовать двух записей с совпадением <cols>
. Следуя этим ответам, вы либо в конечном итоге получите дубликаты строк в базе данных, либо изредка будете иметь исключения (если уникальность выполняется с уникальным индексом).
Почему никто не предлагает такой путь?
begin
Counter.create(name: '...', value: 1)
rescue ActiveRecord::RecordNotUnique
Counter.where(name: '...').update_all('value = value + 1')
end
И что это? Должен ли я пойти с find_or_create_by
/initialize_by
? Или я должен полагаться на уникальный индекс db? На боковой ноте я не могу придумать ни одного случая, когда хочется сделать вставку или обновление и в порядке с дублирующимися строками.
Это риторический вопрос? –
Разве это не удовлетворено, просто используя хорошую проверку? Помните, что концепция рельсов является условной конфигурацией. Зачем что-то усложнять, если нет необходимости? –
@DavidHoelzer Поскольку проверки подвержены условиям гонки, поэтому определенная логика должна идти в базе данных. –