2017-05-10 26 views
0

背景返回兒童(已知的,但不同班)從父

我期待能夠從父類中去,並告訴我自己的一切所有的孩子,但兒童可能是一套指定和已知的,但不同的類別

這裏是設置的例子:

class Basket < ApplicationRecord 
    has_many :apples 
    has_many :pears 
    has_many :oranges 
end 

class Apple 
    belongs_to :basket 
end 

class Pear 
    belongs_to :basket 
end 

class Orange 
    belongs_to :basket 
end 

我知道我能做到這一點 - 逐一對每個特定的水果 - 這是已經支持Rails中,通過活動記錄。

Basket.pears #=> [ Pear:0x007fd6ec615fd8, Pear:0x343d6e343495fd8 ]

實際問題

但我希望能夠從父類(即Basket在這個例子中)去了,告訴我一氣呵成的所有兒童(即ApplesPears,Oranges) 我們可以將這些孩子的分組稱爲fruits ...所以像這樣:

Basket.fruits #=> [ Pear:0x007fd6ec615fd8, Pear:0x343d6e343495fd8, Apple:0x343d6e343495fd8, Orange:0x343d6e343495fd8 ]

此外,我希望它返回一個ActiveRecord_Relation,所以我可以做這樣的事情:

Basket.fruits.where(fruit_seasonality: 'Fall') #=> [ Orange:0x007fd6ec615fd8 ]

(假設在fruits所有的兒童類的,有一個屬性,叫做fruit_seasonality上他們)

我試過的東西:

class Basket < ApplicationRecord 
    has_many :apples 
    has_many :pears 
    has_many :oranges 

    def fruits 
    apples + oranges + pears 
    end 
end 

這是很酷的話,我可以做Basket.fruits,但這種方法會返回一個Array不用於查詢幫助,像Basket.fruits.where

回答

0

這聽起來像你需要單個表繼承(STI)。

class Fruit < ActiveRecord::Base 
    belongs_to :basket 
end 
class Apple < Fruit; end 
class Pear < Fruit; end 
class Orange < Fruit; end 
class Basket < ApplicationRecord 
    has_many :apples 
    has_many :pears 
    has_many :oranges 
    has_many :fruits 
end 

爲此,您需要一臺fruits與列type,而不是4個單獨的表。

+0

我不希望單個表繼承,因爲水果模型在屬性上有很大不同(我想所用的例子並不像它本來可以支持這個的那樣理想) – nickj

+2

在這種情況下,請看一看在多態關聯。在籃子和水果之間使用間歇模型,並使用'belongs_to:fruit,polymorphic:true'。 – slowjack2k