2013-12-19 72 views
1

我有以下3種型號:多態查詢包含所有的多態記錄

class One < ActiveRecord::Base 
    has_many :locations, as: :locatable, dependent: :destroy 
    has_many :countries, through: :locations, order: :name 
end 

class Two < ActiveRecord::Base 
    has_many :locations, as: :locatable, dependent: :destroy 
    has_many :countries, through: :locations, order: :name 
end 

class Three < ActiveRecord::Base 
    has_many :locations, as: :locatable, dependent: :destroy 
    has_many :countries, through: :locations, order: :name 
end 

如何建立一個包含所有三個型號的所有記錄的ActiveRecordRelation?

+0

你能拼出來的僞代碼你想要的查詢指定?如果你只想要所有這些,只需做一個* .all並將結果添加到結果數組中。 – timpone

+0

@timpone問題的關鍵是我想要一個ActiveRecordRelation,而不是一個數組。 – Undistraction

+1

你嘗試過繼承嗎?第二類<然後是第三類<兩個 –

回答

1

使用它們,您可以結合STI和多態關聯:

class Locatable < ActiveRecord::Base 
    has_many :locations, as: :locatable, dependent: :destroy 
    has_many :countries, through: :locations, order: :name 
end 

class One < Locatable 
end 

class Two < Locatable 
end 

class Three < Locatable 
end 

然後你就可以簡單地做:

@locatables = Locatable.scoped # => returns all types of locatable objects 

,以便防止系統創建可定位的對象只是繼承車型有點只會驗證:(有點讓可定位爲「假」的抽象類)

class Locatable < ActiveRecord::Base 
    ALLOWED_TYPES = %w(One Two Three) 
    validates :locatable_type, inclusion: { in: self::ALLOWED_TYPES } 
0

模式OneTwoThree不相互除非通過多態關係有關,所以你需要去這些類之一來獲取你想要的結果。

因此,鑑於所有記錄都有location,並且您的locatable類別被稱爲Location;你應該能夠使用像把所有記錄:

Location.all.each do |location| 
    location.locatable # <-- this would be an individual record from either One, Two, or Three 
end 

僅供參考,你可以找到更多關於多態的關係,以及如何在http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

+0

這給了我一個數組。正如我在問題中所述,我需要一個ActiveRecordRelation。 – Undistraction

+0

因爲一,二和三不相關,所以我不認爲你想要做的事情可能沒有複雜的SQL連接。 – Donovan

+0

感謝@Pedr,最近我一直在寫很多'bash'的例子。 ;) – Donovan

0

不能創建一種關係包括所有三種型號的所有記錄,因爲:

  • 您不能直接在不同的模型建立的關係,除了通過join,然後你有記錄的混合
  • 任何您通過多態性可定位基準建立的關係將被限制在被引用不會實際包含的記錄,只給他們參考這些記錄