2013-09-05 34 views
3

我在ruby on rails博客項目中設置了許多不同的模型。目前,不同的模型類型是文章,快速提示,引用和定義。我創建了一個頁面,我希望在創建時按順序顯示所有這些頁面。同時從數據庫中檢索許多不同類型的模型

問題:什麼是檢索項目的具體數量,在所有內容類型的選擇,通過創建日期排序,智能/有效的方式。

希望說明的僞代碼:

Db.load([:Tip, :Quote, :Article, :Definition]).order_by(:created_at).limit(10) 

最好的解決辦法,我拿出自己到目前爲止加載10個項目每個類別的,對它們進行排序並挑選排序列表的最新10。 :P

+0

如果您可以爲您的表提供模式將會很有幫助。 –

+0

您可以在SQL中創建VIEW(http://stackoverflow.com/questions/13656864/sql-create-view-from-multiple-tables),然後查詢此視圖以獲取所有最新記錄。 – MrYoshiji

+0

MrYoshiji,你的答案取決於是否有共享ID或可以加入的東西,但是這些表完全沒有共同之處。因此,我不想將任何東西組合到複合行中,我只想一次從多個表中檢索數據,並按創建日期_efficiently_排序。 – Daniel

回答

0

所以做我想做什麼辦法就是讓一個超類,說帖子,並讓所有其他內容類型從這個模型中繼承。這將創建一個單表繼承模式,其中所有的子類屬性都保存在「posts」表中,並與「type」屬性一起保存,以便於區分內容類型。我仍然可以正常使用所有內容類型,但也可以獲得Posts模型,以便我可以同時查詢和排序所有內容類型。

More information about the technique can be found here

0

只要將它們組合起來。

(Tip.all + Quote.all + Article.all + Definition.all).order_by(:created_at).limit(10) 

或者

tips = Tips.all.limit(10) 
quotes = Quotes.all.limit(10) 
(tips + quotes).order_by(:created_at).limit(10) 

有此想法?

Possibly useful similar question

+0

我對這個答案感到非常興奮,因爲它似乎是一個優雅的解決方案,但我擔心它不起作用。問題在於數組的連接不會產生新的ActiveRecord關係,而是產生一個普通的Ruby數組 - 它沒有order_by或limit方法。 你提供的鏈接是有幫助的,但答案是將對象加載到數組中,然後對它進行排序(而不是直接從數據庫中檢索)。從本質上講,它提供了與我在問題底部描述的解決方案相同的解決方案......但也許沒有更好的解決方案? – Daniel

+0

是的。這是我的不好。我沒有測試它。第二個答案可以手動排序然後限制。 – screenmutt

0
[Tip, Quote, Article, Definition].map{|model_name| model_name.order(:created_at).first(10)} 
+0

所以這段代碼必要性使得一個數組數組,其中每個子數組包含10個按創建日期排序的給定類型的項。這不是我所要求的。我想要一個按照創建時間排序的所有類型的對象的單個數組,如果可能的話,根本不需要加載超過10個對象。當每個類別中有足夠的對象時,該答案將從數據庫加載40個對象。 – Daniel

+0

哦,我錯了。爲什麼不使用sql查詢'select column_name from tips union select column_name from quotes union select column_name from articles union select column_name from definitions order by created_at;'然後做一個連接= ActiveRecord :: Base.connection;的ActiveRecord :: Base.connection.execute(查詢)。 – deepthi

+0

這是一個好主意,但是不同的表沒有相同數量的字段 - 這是聯合所需的。另一個可能相對較小的警告是連接返回哈希而不是模型。 – Daniel

相關問題