2010-07-22 30 views
3

我有兩個模型是不相關的(在數據庫意義上),但有一些共同的列(名稱,電子郵件等)。如何將2個Rails模型組合成單個查找?

Class Account < ActiveRecord::Base 

end 


Class LegacyAccount < ActiveRecord::Base 

end 

由於各種原因,我無法將它們合併到一個模型或做STI。但我想要一個簡單的視圖,在兩個模型中顯示來自兩個模型的所有記錄(可能按照「名稱」這樣的公共字段排序)。

是否可以從兩個模型中進行查找/查詢?或者我可以做兩個發現併合並結果數組,以便它們排序?我可以使用一些中間模型來合併嗎?

+0

你希望所有的魔法找到的工作?或者它可以像「Account.find_by_account_number」這樣的東西,它會返回一個帳戶或LegacyAccount – 2010-07-22 18:19:43

回答

1

如果他們不能由數據庫連接,那麼也許你可以定義合併的記錄,並返回一個哈希Ruby對象。

class AccountView 
    def self.find_all 
    accounts = [] 
    Account.find(:all).each do |account| 
     accounts << {:name => account.name, ... } 
    end 
    LegacyAccount.find(:all).each do |account| 
     accounts << {:name => account.name, ... } 
    end 
    return accounts 
    end 
end 

或者,在AccountView定義的屬性,並返回AccountView對象數組。

+0

我最終做了Karl的答案和這個答案的混合。我給了這個解決方案,因爲我喜歡把它包裝在一個類中。 – Callmeed 2010-07-23 17:12:44

-1
@accounts = Account.find(:all, :include => :legacy_account) 

或Rails3中加入風格

@accounts = Account.all.joins(:legacy_account) 
+0

不,這似乎並不奏效。我認爲:include/.joins只適用於有關聯的模型。 這兩個模型沒有關聯。我只想將它們組合成一個查找和查看。 – Callmeed 2010-07-22 16:50:10

6

最簡單的解決辦法就是合併陣列,那麼就使用某種Array排序方法:

@accounts = (LegacyAccount.all + Account.all).sort{|x,y| x.name <=> y.name} 

你也許可以寫在你的Account模型的自定義查找方法,使這更容易使你可以只請撥打Account.find_all或其他東西。


有使用SQL另一種可能的解決方案:

@accounts = Account.find_by_sql("SELECT * FROM accounts UNION SELECT * FROM legacy_accounts") 

,在純SQL方面的工作,但我不知道Rails的。我的猜測是它會將所有LegacyAccounts視爲正常帳戶。我不確定如果LegacyAccounts具有帳戶沒有的列,會發生什麼情況。

或者你可以從這裏試一下: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html

後者2個解決方案是棘手,所以我只是嘗試一下,如果你有非常具體的想法。

1

只是我的2美分,這裏是我用於網站的RSS供稿:

(Model1.latest + Model2.latest).sort_by(&:created_at).reverse