2014-02-20 77 views
2

我正在開發的Rails應用程序有兩個模型:ReviewInterview。它們本質上都是文章,但它們的屬性和行爲卻有所不同。將兩個ActiveRecord模型合併爲一個

某些應用程序的頁面需要一起顯示評論和訪談,就好像它們來自同一模型一樣。這意味着我需要將它們放到一個模型中,然後將這個模型用作「代理」。

我通過實施Article模型用下面的代碼實現了基本結果:

class Article 
    MODELS = [Review, Interview] 

    def self.fetch(&block) 
    block = Proc.new { all } unless block_given? 
    results = [] 

    MODELS.each do |model| 
     suppress(StandardError) do 
     results.push(*model.class_eval(&block)) 
     end 
    end 

    results 
    end 
end 

這爲我提供的基本功能,我需要。我現在可以使用類似於Article.fetch { where("created_at >= ?", 10.days.ago.to_date) }的東西,同樣的查詢將在兩個模型上運行,給我一組結果(不按日期排序,但實際上評論和訪談分塊在一起,因爲它們來自兩個不同的查詢)。

這種方法似乎可行,但它也有一些重要的缺點。
一個重要的問題是,如果您希望將結果正確排序,則必須在查詢後手動執行任何類型的排序。

我沒有遇到實施我自己的方法來解決我遇到的問題,但我想知道是否有更多的標準方式來實現這個在Rails中。

回答

1

看看你的問題,你基本上有兩個模型具有不同的屬性和行爲。

一種方法是創建一個父類,其中有兩個從父類繼承的子類。

class Article

class Review < Article & class Interview < Article

使用單表繼承(STI)的方法,你只需要創建一個類型列,將區分兩個具有驗證和列填充根據該子類。

+0

我是否需要在同一張桌子上擁有兩個模型所需的所有列? –

+0

如果你需要他們在同一張桌子上是的,驗證將基於類 – jamesy829