我有三个STI课程。
class Media < ActiveRecord::Base
end
class Music < Media
end
class CD < Music
end
当我做Media.all =&gt;我从音乐课和CD课得到了对象。
但是,当我做Music.all =&gt;我只从Music类中获取对象。
我希望Music.all从Music类和CD类中返回对象。这是可能的,我该如何实现它。我一直在谷歌搜索大部分时间,但没有遇到任何有助于我实现目标的事情。
答案 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