如何对子类的单表继承子类的查找结果进行分组

时间:2013-01-01 01:10:38

标签: ruby-on-rails ruby-on-rails-3 single-table-inheritance

我有三个STI课程。

class Media < ActiveRecord::Base

end

class Music < Media

end


class CD < Music

end
  1. 当我做Media.all =&gt;我从音乐课和CD课得到了对象。

  2. 但是,当我做Music.all =&gt;我只从Music类中获取对象。

  3. 我希望Music.all从Music类和CD类中返回对象。这是可能的,我该如何实现它。我一直在谷歌搜索大部分时间,但没有遇到任何有助于我实现目标的事情。

2 个答案:

答案 0 :(得分:2)

您可以做的一件事是覆盖all类中的Music方法。

def self.all
  super + CD.all
end

+会将所有CD个实例连接到所有Music个实例的结果集数组。

答案 1 :(得分:1)

单表继承(STI):继承模型的HOWTO范围记录?

解决方案1: ActiveRecord开发人员提供的方式,但出于某种原因,默认情况下它多年来都不起作用! [为什么?]

class Media < ActiveRecord::Base
  ...
end

class Music < Media
  def self.descendants
    super|[CD]
  end
end

class CD < Music
  ...
end

# Result:

Music.where(:name => "Pink Floyd").to_sql
#=> SELECT "medias".* FROM "medias" WHERE "medias"."type" IN ('Music', 'CD') AND "medias"."name" = "Pink Floyd"

解决方案2:直接自定义'STI'类型条件:

class Music < Media
  private
  def self.type_condition(*args)
    super.tap {|arel_node| arel_node.right << "CD"}
  end
end