我正在使用RoR进行应用开发,并希望实现以下功能:
对于应用程序的RSS提要,我需要从数据库中提取10个最新条目。我无法弄清楚的部分是如何在多个表中获得最后10个条目。
从单个数据库表中提取最后n
条记录很简单,但如何在多个数据库表中提取最后n
条记录。
有什么建议吗?
答案 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视图而不是表返回它。这篇文章解释了这种方法:
答案 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(单表继承)。但这需要重组您的数据库和模型。