在一个查询中获取不同模型的孩子

时间:2017-05-27 19:30:34

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

class Category
  has_many :images
  has_many :articles
end

class Image
  belongs_to :category
end

class Article
  belongs_to :category
end

我试图了解Rails中有哪些解决方案可供同一父母查询不同模型的孩子?

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

3 个答案:

答案 0 :(得分:0)

您可以在rails中尝试'包含' Article.includes(:类别)

答案 1 :(得分:0)

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

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

基本上,您传递了所需的Category ID并获得:images, :articles具有特定ID的belongs_to类别。 sort_by可能应该进行排序。

blog post on eager loading也可以为您提供帮助。

答案 2 :(得分:0)

您不能简单地强制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)

我真的不鼓励这个选项,因为它会带来很多重复的信息,因为你将加入三个表格,将它们分类以供你使用真的很痛苦。