【问题标题】:Get children of different models in one single query在一个查询中获取不同模型的孩子
【发布时间】:2017-05-27 19:30:33
【问题描述】:
class Category
  has_many :images
  has_many :articles
end

class Image
  belongs_to :category
end

class Article
  belongs_to :category
end

我想了解 Rails 中有哪些解决方案可以让同一个父级查询不同模型的子级?

例如我想获取属于同一类别的所有图像和文章,并按created_at 对它们进行排序。

【问题讨论】:

  • 我在想这不是关于eager loading multiple association吗?
  • 我认为在他们的示例 Article.includes(:category, :comments) 中加载所有 Articles ?但如果你有一个可行的例子,我很乐意看到!
  • 在 Rails 示例中“这会加载所有文章以及每篇文章的相关类别和 cmets”。在您的情况下,它可能是Category.includes(:images, :articles),其中Category 是您想要的ID。
  • 如果我的问题不清楚,我很乐意澄清。但再一次,请提交一个工作示例的答案:)

标签: ruby-on-rails associations ruby-on-rails-5 ruby-on-rails-5.1


【解决方案1】:

您可以在 rails 中尝试“包含” Article.includes(:Category)

【讨论】:

  • 介意展示一个如何在这种情况下使用的例子吗?
【解决方案2】:

正如我所说,在我看来您可以使用eager loading multiple associations。在你的情况下,它可能是这样的:

Category.where(id: 2).includes(:images, :articles).sort_by(&:created_at)

基本上,您传递您想要的Category ID 并获得:images, :articles 其中belongs_to 具有特定ID 的类别。 sort_by可能应该做排序的事情。

这个blog post on eager loading 也可以帮助你。

【讨论】:

    【解决方案3】:

    您不能简单地强制 Active Record 在单个查询 (afaik) 中引入所有依赖项,无论是延迟加载/急切加载。我认为你最好的选择是:

    class Category
      has_many :images, -> { order(:created_at) }
      has_many :articles, -> { order(:created_at) }
    end
    
    categories = Category.includes(:images, :articles)
    

    只要你迭代类别并获取它们的图像和文章,这将进行三个查询,每个表一个 categoriesimagesarticles,这是一个很好的折衷,以方便使用ORM.
    现在,如果您坚持在一次查询中包含所有这些信息,那么肯定它必须是使用Arel 的一种方式,但如果值得,请三思。我看到的最后一个选择是好的旧 SQL:

    query = <<-SQL 
      SELECT *, images.*, articles.* 
      FROM categories
      -- and so on with joins, orders, etc...
    SQL
    
    result = ActiveRecord::Base.connection.execute(query)
    

    我真的不鼓励这个选项,因为它会带来很多重复的信息,因为您将加入三个表,并且对它们进行排序以供您使用真的很痛苦。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多