我在Rails 4.1中有一个有趣的关联,我正在尝试设计,似乎无法找到正确的方法来实现它,所以我想我会寻求帮助。
本质上,我们有四个重要的模型:ActivityTemplate,、Device和DeviceType。一个家族有许多设备,设备belongs_to a DeviceType和ActivityTemplates has_and_belongs_to_many DeviceTypes (想想:这些设备类型在这个活动中是受支持的)。第五种模式是我们的FamilyActivity,belongs_to家族和ActivtyTemplate。
我要做的是获取可用的familyActivityInstance.available_devices列表。或者,换句话说,我们知道基于Family.设备->DeviceType关联的DeviceTypes能够在FamilyActivity中使用什么,并且我们知道该活动通过其FamilyActivity.Activity.Active_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发布于 2015-01-16 17:13:07
除了你们现有的协会之外:
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
endhttps://stackoverflow.com/questions/27989071
复制相似问题