0

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

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

n从单个数据库表中提取最后一条记录很容易,但是如何跨多个数据库表提取最后一条记录n

有什么建议么?

4

2 回答 2

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 类。或者更好的是只获取 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 视图而不是表来支持它。该方法在这篇文章中进行了解释:

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

于 2013-10-14T07:21:24.610 回答
0

是否有特殊原因要将多个表的查询组合到一个 sql 查询中?我认为不可能进行联合查询。

你可以尝试这样的事情,但它并不完全是你想要的:

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

取自: rails 3 合并来自不同表的多个查询

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

于 2013-10-14T04:38:42.397 回答