2013-09-05 51 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

相关问题