如何分组查找单个表继承子类的结果子类

问题描述:

我有三个STI类。如何分组查找单个表继承子类的结果子类

class Media < ActiveRecord::Base 

end 

class Music < Media 

end 


class CD < Music 

end 
  1. 当我做了Media.all =>我从音乐类CD类对象。

  2. 但是,当我做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 
+0

你介意通过你的回应走过我吗?这是我的联盟出路。非常感谢。 – Mutuelinvestor

+1

这是一个小技巧。一般来说,我们覆盖AR的继承逻辑的关键方法,该逻辑确定用于确定STI的db表的基本参数。我们刚刚学会了如何寻找其他课程。该解决方案被发现优雅无害。 –

+0

“ActiveRecord开发者提供的方式”可以链接到你发现它的地方吗? – deefour

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

def self.all 
    super + CD.all 
end 

+将串联所有CD实例所有Music实例的结果集的数组。

+0

感谢您的答复。这是否也允许我使用Music.last,以便从音乐或CD返回最后一个。 – Mutuelinvestor