У меня есть интересная ассоциация в Rails 4.1. Я пытаюсь создать дизайн и не могу придумать правильный способ сделать это, поэтому подумал, что попрошу о помощи.Rails 4 с использованием множественной ассоциации для генерации отфильтрованной ассоциации
По сути, у нас есть четыре модели, которые имеют значение: Семья, ActivityTemplate, Устройство и DeviceType. У семейства много устройств, Device принадлежит к DeviceType и ActivityTemplates has_and_belongs_to_many DeviceTypes (подумайте: эти типы устройств поддерживаются в этом действии). 5-я модель - это наш FamilyActivity который принадлежит_о семье и ActivtyTemplate.
То, что я пытаюсь сделать, это получить список familyActivityInstance.available_devices, которые доступны. Или, другими словами, мы знаем, какие DeviceTypes могут использоваться в FamilyActivity на основе ассоциации Family.devices-> DeviceType. И мы знаем, что активность поддерживает только определенные типы устройств через свою ассоциацию FamilyActivity.activity_template-> DeviceType, поэтому мы хотим предоставить список подмножества Family.devices, которые включены в списки ассоциаций типов устройств BOTH.
В идеале, мы бы хотели вызвать FamilyActivity.available_devices, чтобы получить этот список. Мы можем перенаправить это, итерации через устройства и сравнение типов устройств, но, безусловно, есть лучший способ!
Вот модели только для справки:
class Family < ActiveRecord::Base
has_many :devices
end
class Device < ActiveRecord::Base
belongs_to :device_type
belongs_to :family
end
class DeviceType < ActiveRecord::Base
has_and_belongs_to_many :family_activities
end
class FamilyActivity < ActiveRecord::Base
belongs_to :family
belongs_to :activity_template
end
class ActivityTemplate < ActiveRecord::Base
has_and_belongs_to_many :device_types
has_many :family_activities, dependent: :nullify
end
Я вижу, где вы собираетесь с этим, но я не могу показаться, добирайся до конца. При запуске как написано вы получаете 'ActiveRecord :: ConfigurationError: ассоциация с именем« activity_template »не найдена на Device; возможно, вы его опечалили? ' – DaKaZ
Моя ошибка. 'Joins' применяется к' Device', а не к 'FamilyActivity'. Самое быстрое решение, которое я могу предложить сейчас, - это метод экземпляра, который возвращает объект ActiveRecord :: Relation. Я считаю, что для вашей цели этого должно быть достаточно. (Я отредактировал свой ответ). – Humza
Это отличный ответ и отлично работает! Большое вам спасибо @humza – DaKaZ