Я думаю, что используемая модель устанавливает слишком много идентификаторов между таблицами, которые требуют проверки согласованности.
Если вы настроите модель таким образом, вам не нужно проверять, что ферма лошади и событие согласованы, поскольку данные гарантируют это:
class Farm < ApplicationRecord
has_many :horses
has_many :events
end
class Horse < ApplicationRecord
belongs_to :farm
has_many :events, through: :farm
end
class Event < ApplicationRecord
belongs_to :farm
has_many :horses, through: :farm
end
Если вам нужен эффективный доступ к лошадям из событий или событий от лошадей, вы можете использовать объединения. Это дает некоторую простоту, ясность и последовательность.
Вы также должны взглянуть на Выбор между has_many_through
и has_and_belongs_to_many
.
<ч />
[Редактировать на основе обновленного вопроса и комментариев] Теперь, когда ваша модель и вопрос немного более понятны, я догадываюсь, что помещение проверки в модель Event
вызывает избыточные проверки. Поскольку ваша цель состоит в том, чтобы убедиться, что в данном случае лошадь и ферма согласованы, я бы поставил валидацию в EventsHorses
:
class Event::EventsHorse < ApplicationRecord
...
validate :horse_belongs_to_farm
private
def horse_belongs_to_farm
horse.farm_id == event.farm_id
end
end
Кроме того, у вас есть Event::EventsHorse
, а не просто отдельная модель для EventsHorse
?