首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含所有多态记录的多态查询

包含所有多态记录的多态查询
EN

Stack Overflow用户
提问于 2013-12-19 15:44:18
回答 3查看 130关注 0票数 1

我有以下三种型号:

代码语言:javascript
复制
class One < ActiveRecord::Base
   has_many :locations, as: :locatable, dependent: :destroy
   has_many :countries, through: :locations, order: :name
end

class Two < ActiveRecord::Base
   has_many :locations, as: :locatable, dependent: :destroy
   has_many :countries, through: :locations, order: :name
end

class Three < ActiveRecord::Base
   has_many :locations, as: :locatable, dependent: :destroy
   has_many :countries, through: :locations, order: :name
end

如何构建包含所有三个模型的所有记录的ActiveRecordRelation?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-19 16:55:24

您可以组合STI和多态关联:

代码语言:javascript
复制
class Locatable < ActiveRecord::Base
  has_many :locations, as: :locatable, dependent: :destroy
  has_many :countries, through: :locations, order: :name
end

class One < Locatable
end

class Two < Locatable
end

class Three < Locatable
end

然后你可以简单地做:

代码语言:javascript
复制
@locatables = Locatable.scoped # => returns all types of locatable objects

使用一些验证,以防止系统创建可定位的对象,但只创建继承的模型:(使“假”抽象类可以定位)

代码语言:javascript
复制
class Locatable < ActiveRecord::Base
  ALLOWED_TYPES = %w( One Two Three )
  validates :locatable_type, inclusion: { in: self::ALLOWED_TYPES }
票数 1
EN

Stack Overflow用户

发布于 2013-12-19 16:18:59

除了通过多态关系之外,模型OneTwoThree并不相互关联,因此您需要使用其中的一个类来获得所需的结果。

因此,假设所有记录都有一个location,并且您的locatable类被称为Location;您应该能够使用如下所示的方式获取所有记录:

代码语言:javascript
复制
Location.all.each do |location|
  location.locatable # <-- this would be an individual record from either One, Two, or Three
end

FYI,您可以找到更多关于多态关系的信息,以及如何在basics.html#polymorphic-associations中使用它们。

票数 0
EN

Stack Overflow用户

发布于 2013-12-19 17:05:05

不能创建包含所有三个模型的所有记录的关系,因为:

  • 除了通过join之外,您不能在不同的模型之间直接创建一个关系,然后就有了记录的混合。
  • 通过多态位置引用创建的任何关系都将仅限于那些被引用的记录,并且不实际包含这些记录,只包含对它们的引用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20685839

复制
相关文章

相似问题

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