2015-01-16 3 views
1

У меня есть интересная ассоциация в 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 

ответ

0

В дополнении к существующим ассоциациям:

class DeviceType < ActiveRecord::Base 
    has_many :devices 
end 

class FamilyActivity < ActiveRecord::Base 
    delegate :device_types, to: :activity_template 

    def available_devices 
    device_ids = \ 
     device_types. 
     joins(:devices). 
     where(devices: {family_id: self.family_id}). 
     pluck("DISTINCT devices.id") 

    Device.where(id: device_ids) 
    end 
end 
+0

Я вижу, где вы собираетесь с этим, но я не могу показаться, добирайся до конца. При запуске как написано вы получаете 'ActiveRecord :: ConfigurationError: ассоциация с именем« activity_template »не найдена на Device; возможно, вы его опечалили? ' – DaKaZ

+0

Моя ошибка. 'Joins' применяется к' Device', а не к 'FamilyActivity'. Самое быстрое решение, которое я могу предложить сейчас, - это метод экземпляра, который возвращает объект ActiveRecord :: Relation. Я считаю, что для вашей цели этого должно быть достаточно. (Я отредактировал свой ответ). – Humza

+0

Это отличный ответ и отлично работает! Большое вам спасибо @humza – DaKaZ

Смежные вопросы