2015-01-16 2 views
1

레일 4.1에서 흥미로운 연관성이 있습니다. 디자인을 시도하고 있습니다. 올바른 방법을 찾지 못해서 도움을 요청할 것입니다. 가족, ActivityTemplate, 장치되는 DeviceType :Rails 4에서 다중 연관을 사용하여 필터링 된 연결 생성

는 기본적으로, 우리는 중요한 4 개 가지 모델이있다. 제품군에는 여러 개의 Devices, Device belongs_to DeviceType 및 ActivityTemplates hasandand allbelongs_to_many DeviceTypes가 있습니다 (이 장치 유형은이 활동에서 지원됩니다). 제 5 모델은 우리의 FamilyActivity이며 belongs_to Family 및 ActivtyTemplate입니다.

내가하려는 것은 familyActivityInstance.available_devices의 목록을 사용할 수 있습니다. 다른 말로하면, 우리는 Family.devices-> DeviceType 연관을 기반으로하는 FamilyActivity에서 어떤 DeviceTypes를 사용할 수 있는지 알고 있으며 Activity가 FamilyActivity.activity_template-> DeviceType 연관을 통해 특정 장치 유형 만 지원한다는 것을 알고 있습니다. 그래서 우리는 두 장치 유형 연관 목록에 모두 포함되어있는 Family.devices의 하위 집합 목록을 전달하려고합니다.

이상적으로는 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 : Association에 'activity_template'이라는 연관을 찾을 수 없습니다. 아마도 철자가 틀린거야? ' – DaKaZ

+0

내 실수. 조인은'FamilyActivity'보다는'Device'에 적용되었습니다. 지금 제공 할 수있는 가장 빠른 해결책은'ActiveRecord :: Relation' 객체를 반환하는 인스턴스 메소드를 이용하는 것입니다. 나는 당신의 목적을 위해 이것으로 충분하다고 믿습니다. (나는 나의 응답을 편집했다). – Humza

+0

훌륭한 답변이며 완벽하게 작동합니다! 고맙습니다. @humza – DaKaZ

관련 문제