1

我有三個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,但沒有遇到任何可以幫助我實現目標的內容。

回答

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 
+0

你介意通過你的迴應走過我嗎?這是我的聯盟出路。非常感謝。 – Mutuelinvestor

+1

這是一個小技巧。一般來說,我們覆蓋AR的繼承邏輯的關鍵方法,該邏輯確定用於確定STI的db表的基本參數。我們剛剛學會了如何尋找其他課程。該解決方案被發現優雅無害。 –

+0

「ActiveRecord開發者提供的方式」可以鏈接到你發現它的地方嗎? – deefour

2

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

def self.all 
    super + CD.all 
end 

+將串聯所有CD實例所有Music實例的結果集的數組。

+0

感謝您的答覆。這是否也允許我使用Music.last,以便從音樂或CD返回最後一個。 – Mutuelinvestor