我在Rails 4.1中有一个有趣的关联,我正在尝试设计,但似乎无法提出正确的方法来做,所以以为我会寻求帮助。
本质上,我们有四个重要的模型:Family,ActivityTemplate,Device和DeviceType。一个家庭有许多设备,设备属于设备类型,而活动模板具有设备类型(请考虑:此活动支持这些设备类型)。第五个模型是我们的FamilyActivity,它属于Family和ActivtyTemplate。
我正在尝试获取可用的familyActivityInstance.available_devices列表。或者,换句话说,我们根据Family.devices-> DeviceType关联知道在FamilyActivity中可以使用哪些DeviceType,并且,我们知道该活动通过其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
除了您现有的关联之外:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句