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
对它们进行排序。
答案 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)
只要您迭代类别并获取他们的图片和文章,这将产生三个查询,每个表categories
,images
和articles
一个,这是一个很好的权衡ORM的易用性。
现在,如果您坚持只在一个查询中提供所有信息,那么肯定它必须是使用Arel的方式,但如果值得,请三思而后行。我看到的最后一个选择是好的旧SQL:
query = <<-SQL
SELECT *, images.*, articles.*
FROM categories
-- and so on with joins, orders, etc...
SQL
result = ActiveRecord::Base.connection.execute(query)
我真的不鼓励这个选项,因为它会带来很多重复的信息,因为你将加入三个表格,将它们分类以供你使用真的很痛苦。