我正在使用 RoR 进行应用程序开发,并希望实现以下功能:
对于应用程序的 RSS 提要,我需要从数据库中提取 10 个最新条目。我无法弄清楚的部分是如何跨多个表获取最后 10 个条目。
n
从单个数据库表中提取最后一条记录很容易,但是如何跨多个数据库表提取最后一条记录n
。
有什么建议么?
我正在使用 RoR 进行应用程序开发,并希望实现以下功能:
对于应用程序的 RSS 提要,我需要从数据库中提取 10 个最新条目。我无法弄清楚的部分是如何跨多个表获取最后 10 个条目。
n
从单个数据库表中提取最后一条记录很容易,但是如何跨多个数据库表提取最后一条记录n
。
有什么建议么?
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 类。或者更好的是只获取 You 所需的值并使用普通的 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 视图而不是表来支持它。该方法在这篇文章中进行了解释:
是否有特殊原因要将多个表的查询组合到一个 sql 查询中?我认为不可能进行联合查询。
你可以尝试这样的事情,但它并不完全是你想要的:
@all_items = [@record_videos.all, @musics.all, @new_topics.all].flatten.sort_by{ |thing| thing.created_at}
如果它对您很重要,那么在 Rails 中实现这一点的真正方法是使用 STI(单表继承)。但这需要重组您的数据库和模型。