Гарантия того, что модель связана с одним и тем же родителем - PullRequest
0 голосов
/ 17 января 2019

При условии, что у меня есть 3 модели, связанные друг с другом:

class Farm < ApplicationRecord
  has_many :horses
  has_many :events
end

class Horse < ApplicationRecord
  belongs_to :farm
  has_many :events_horses, class_name: 'Event::EventsHorse'
  has_many :events, through: :events_horses, source: :event, dependent: :destroy
end

class Event
  belongs_to :farm
  has_many :events_horses, class_name: 'Event::EventsHorse'
  has_many :horses, through: :events_horses, source: :horse, dependent: :destroy
end

class Event::EventsHorse < ApplicationRecord
  self.table_name = "events_horses"

  belongs_to :horse
  belongs_to :event

  audited associated_with: :event, except: [:id, :event_id]
end

Как гарантировать, что каждая Лошадь принадлежит к одной Ферме как событие? Возможное решение заключается в использовании пользовательской проверки, но мне было интересно, есть ли другой способ. У меня есть несколько других моделей, таких как Horse, поэтому мне приходится настраивать метод проверки для каждой из них.

class Event
  ...
  validate :horses_belongs_to_farm

  private

  def horses_belongs_to_farm
    horses.all? {|h| h.farm_id == farm_id}
  end   
end

1 Ответ

0 голосов
/ 17 января 2019

Я думаю, что используемая модель устанавливает слишком много идентификаторов между таблицами, которые требуют проверки согласованности.

Если вы настроите модель таким образом, вам не нужно проверять, что ферма лошади и событие согласованы, поскольку данные гарантируют это:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...