【问题标题】:Retrieving many different kinds of models from the database at the same time同时从数据库中检索多种不同类型的模型
【发布时间】:2013-09-05 17:56:18
【问题描述】:

我在我的 ruby​​ on rails 博客项目中设置了许多不同的模型。目前不同的模型类型是文章、快速提示、引用和定义。我创建了一个页面,我希望在其中按创建时间排序的单个流中显示所有这些。

问题:从所有内容类型中选择并按创建日期排序,检索特定数量的项目的智能/有效方法是什么。

希望是说明性的伪代码:

Db.load([:Tip, :Quote, :Article, :Definition]).order_by(:created_at).limit(10)

到目前为止,我自己想出的最佳解决方案是加载每个类别的 10 个项目,对它们进行排序并从排序列表中选择最新的 10 个。 :P

【问题讨论】:

  • 如果您可以为您的表提供架构将会很有帮助。
  • 您可以在 SQL (stackoverflow.com/questions/13656864/…) 中创建一个 VIEW,然后查询该视图以获取所有最新记录。
  • Yoshiji 先生,您的答案取决于是否存在共享 ID 或可以进行连接的东西,但是这些表根本没有共同点。因此,我不想将任何内容组合成复合行,我只想一次从多个表中检索数据,按创建日期排序,高效
  • 安德烈·迪翁,虽然我很同情你想要了解所有事实的愿望,但我很确定每张桌子的细节对于手头的问题来说是无趣的,因为问题应该是相当笼统的。假设这些表完全不相关,包含不同的字段并且不共享任何信息。如果您仍然认为查看完整架构会有所帮助,那么我会发布它。

标签: sql ruby-on-rails ruby activerecord ruby-on-rails-4


【解决方案1】:

只需将它们组合起来。

(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

【讨论】:

  • 我对这个答案感到非常兴奋,因为它似乎是一个优雅的解决方案,但恐怕它不起作用。问题是数组的串联不会产生新的 ActiveRecord 关系,而是产生一个普通的 Ruby 数组——它没有 order_by 或 limit 方法。您提供的链接很有帮助,但那里的答案将对象加载到一个数组中,然后对其进行排序(而不是直接在从数据库的检索中对其进行排序)。本质上,它提供的解决方案与我在问题底部描述的解决方案相同......但也许没有更好的解决方案?
  • 是的。那是我的错。我没有测试它。第二个答案可以手动排序,然后限制。
【解决方案2】:
[Tip, Quote, Article, Definition].map{|model_name| model_name.order(:created_at).first(10)}

【讨论】:

  • 所以这段代码本质上创建了一个数组数组,其中每个子数组包含 10 个给定类型的项,按创建日期排序。这不是我要的。我想要一个按创建时间排序的各种对象的数组,如果可能的话,根本不需要加载超过 10 个对象。当每个类别中有足够的对象时,此答案会从数据库中加载 40 个对象。
  • 哦,我弄错了。为什么不 sql query 'select column_name from Tips union select column_name from quotes union select column_name from items union select column_name from definitions order by created_at;'然后做一个连接 = ActiveRecord::Base.connection; ActiveRecord::Base.connection.execute(query).
  • 这是个好主意,但是不同的表没有相同数量的字段 - 这是联合所必需的。另一个可能相对较小的警告是连接返回哈希而不是模型。
【解决方案3】:

所以我想要做的方法是创建一个超类,比如 Post,并让所有其他内容类型都继承自这个模型。这将创建一个单表继承方案,其中所有子类属性都保存在“posts”表中,以及便于区分内容类型的“type”属性。我应该仍然能够正常使用所有内容类型,而且还可以获得一个帖子模型,我可以在其中同时查询和排序所有内容类型。

More information about the technique can be found here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 2018-05-30
    • 2012-01-09
    • 2018-08-15
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多