После перемещения моего приложения из Rails 4.2.8 в 5.2.3 вставки завершаются с ошибкой
Billings event must exist
Приложение получает один каскадный хэш с одним событием и множеством связанных счетов и должен поместить его в базу данных в виде one single транзакция ; это всегда работало раньше.
class Event < ActiveRecord::Base
has_many :billings, -> { where('1 = 1') }, dependent: :destroy
accepts_nested_attributes_for :billings
validates_associated :billings
end
class Billing < ActiveRecord::Base
belongs_to :event
validates_presence_of :event_id, on: :update
end
class EventsController < ApplicationController
def kC
@event = Event.new(event_params)
if @event.save
[doesn't get here anymore]
end
end
end
Контроллера для выставления счетов нет, они существуют только через связанное с ними событие.
Быстрый анализ показывает, что в документах упоминается, что
belongs_to :event, optional: true
позволит избежать этой ошибки, и это действительно так. Но это кажется мне очень неправильным, потому что в этом приложении биллинги не должны никогда существовать без их события, это НЕ необязательно!
Но тогда каково правильное решение?
Дальнейший анализ показывает: все проверки обрабатываются, но обратный вызов before_create () никогда не достигается. Ошибка «должен существовать» добавлена в каком-то внутреннем месте, она не приходит из моего кода.
Кроме того, при создании шаблона только с кодом, как показано выше, я обнаружил, что проблемным кодом является область видимости -> { where('1 = 1') }
В реальном приложении это более сложный (и более полезный) термин, но этот простой и, казалось бы, прозрачный термин вызывает проблему точно так же.
Здесь много подобных вопросов, но тогда у многих возникает ситуация, когда ассоциация действительно необязательна, у некоторых есть нестандартные наименования (я не думаю, что у меня, как это было раньше), и я не нашел ни одного для этого случая, когда принадлежащая модель полностью обрабатывается через имеющую.