Rails4 使用多重关联生成过滤关联

Rails 4 using multiple association to generate a filtered association

我在 Rails 4.1 中有一个有趣的关联我正在尝试设计,但似乎无法想出正确的方法,所以我想我会寻求帮助。

基本上,我们有四个重要的模型:FamilyActivityTemplateDevice设备类型。一个Family有很多Devices,Devicebelongs_to一个DeviceType,ActivityTemplates有_and_belongs_to_many DeviceTypes(想想:这activity支持这些设备类型)。第 5 个模型是我们的 FamilyActivity,其中 belongs_to Family 和 ActivtyTemplate。

我想做的是获取可用的 familyActivityInstance.available_devices 列表。或者,换句话说,基于 Family.devices->DeviceType 关联,我们知道哪些 DeviceTypes 能够在 FamilyActivity 中使用,并且,我们知道 activity 通过其 [= 仅支持某些设备类型40=]->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

除了您现有的协会:

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