如何分组查找单个表继承子类的结果子类
问题描述:
我有三个STI类。如何分组查找单个表继承子类的结果子类
class Media < ActiveRecord::Base
end
class Music < Media
end
class CD < Music
end
当我做了Media.all =>我从音乐类CD类对象。
但是,当我做Music.all =>我只从Music类获取对象。
我想Music.all从音乐和CD类都返回对象。这是可能的,我如何实现它。我在下午的大部分时间都在使用Google,但没有遇到任何可以帮助我实现目标的内容。
答
单表继承(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
答
你可以做的一件事是覆盖Music
类中的all
方法。
def self.all
super + CD.all
end
+
将串联所有CD
实例所有Music
实例的结果集的数组。
+0
感谢您的答复。这是否也允许我使用Music.last,以便从音乐或CD返回最后一个。 – Mutuelinvestor
你介意通过你的回应走过我吗?这是我的联盟出路。非常感谢。 – Mutuelinvestor
这是一个小技巧。一般来说,我们覆盖AR的继承逻辑的关键方法,该逻辑确定用于确定STI的db表的基本参数。我们刚刚学会了如何寻找其他课程。该解决方案被发现优雅无害。 –
“ActiveRecord开发者提供的方式”可以链接到你发现它的地方吗? – deefour