Rails4 使用多重关联生成过滤关联
Rails 4 using multiple association to generate a filtered association
我在 Rails 4.1 中有一个有趣的关联我正在尝试设计,但似乎无法想出正确的方法,所以我想我会寻求帮助。
基本上,我们有四个重要的模型:Family、ActivityTemplate、Device 和设备类型。一个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
我在 Rails 4.1 中有一个有趣的关联我正在尝试设计,但似乎无法想出正确的方法,所以我想我会寻求帮助。
基本上,我们有四个重要的模型:Family、ActivityTemplate、Device 和设备类型。一个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