Rails - 从多个表中获取最新条目

时间:2013-10-14 04:24:56

标签: sql ruby-on-rails activerecord

我正在使用RoR进行应用开发,并希望实现以下功能:

对于应用程序的RSS提要,我需要从数据库中提取10个最新条目。我无法弄清楚的部分是如何在多个表中获得最后10个条目。

从单个数据库表中提取最后n条记录很简单,但如何在多个数据库表中提取最后n条记录。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

ActiveRecord中没有内置方法,在SQL中执行此操作非常简单您只需执行UNION。

SELECT * FROM (
  SELECT table1.*, 'table_1_type' AS table_type FROM table1 
  UNION ALL SELECT table2.*, 'table_2_type' AS table_type FROM table2 
  UNION SELECT table3.*, 'table_3_type' AS table_type FROM table3 
) AS my_union ORDER created_at DESC LIMIT 10;

此查询将返回10行,每行将包含每个行的表。我建议您创建执行此原始查询并重建对象的纯Ruby类。 或者甚至更好地获取您所需的值并使用纯Ruby类(不使用You模型)来表示它们。

您可以通过任何AR类访问postgres连接,例如MyModelClass.connection 使用原始连接的示例:

conn = MyModelClass.connection
res  = conn.exec('select tablename, tableowner from pg_tables')

res.each do |row|
  row.each do |column|
   puts column
  end
end

以相同的方式执行您的查询并填充Ruby对象。

<强> UPD

您还可以使用第三种选择。创建一个新的模型RssItem并使用SQL视图而不是表返回它。这篇文章解释了这种方法:

http://hashrocket.com/blog/posts/sql-views-and-activerecord

答案 1 :(得分:0)

您是否有特殊原因希望将多个表的查询合并到一个SQL查询中?我认为不可能进行联合查询。

你可以试试这样的东西,但它并不是你想要的东西:

@all_items = [@record_videos.all, @musics.all, @new_topics.all].flatten.sort_by{ |thing|   thing.created_at}

取自: rails 3 merge multiple queries from different tables

如果它对您很重要,那么在Rails中实现此目的的真正方法是使用STI(单表继承)。但这需要重组您的数据库和模型。