首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4使用多个关联生成过滤关联

Rails 4使用多个关联生成过滤关联
EN

Stack Overflow用户
提问于 2015-01-16 17:04:35
回答 1查看 42关注 0票数 1

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

本质上,我们有四个重要的模型:ActivityTemplate,、DeviceDeviceType。一个家族有许多设备,设备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来获取这个列表。我们可以通过迭代设备和比较设备类型来强制执行,但是肯定有更好的方法!

以下是供参考的模型:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-16 17:13:07

除了你们现有的协会之外:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27989071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档