class Category
has_many :images
has_many :articles
end
class Image
belongs_to :category
end
class Article
belongs_to :category
end
我试图了解 Rails 中有哪些解决方案可以让同一父级查询不同模型的子级?
例如,我想获取属于同一类别的所有图像和文章,并按created_at
.
class Category
has_many :images
has_many :articles
end
class Image
belongs_to :category
end
class Article
belongs_to :category
end
我试图了解 Rails 中有哪些解决方案可以让同一父级查询不同模型的子级?
例如,我想获取属于同一类别的所有图像和文章,并按created_at
.
正如我所说,在我看来,您可以使用急切加载多个关联。在你的情况下,它可能是这样的:
Category.where(id: 2).includes(:images, :articles).sort_by(&:created_at)
基本上,您传递所需的Category
ID 并获取:images, :articles
具有belongs_to
特定 ID 的类别。sort_by
可能应该做排序的事情。
这篇关于急切加载的博客文章也可以为您提供帮助。
您不能简单地强制 Active Record 将它们的所有依赖项带入单个查询 (afaik),无论是否是延迟/急切加载。我认为你最好的选择是:
class Category
has_many :images, -> { order(:created_at) }
has_many :articles, -> { order(:created_at) }
end
categories = Category.includes(:images, :articles)
只要您迭代类别并获取它们的图像和文章,这将进行三个查询,每个表一个和categories
,这对于 ORM 的易用性是一个很好的折衷。
现在,如果您坚持在一个查询中包含所有这些信息,那么肯定它一定是使用Arel的一种方式,但如果值得,请三思。我看到的最后一个选择是好的旧 SQL:images
articles
query = <<-SQL
SELECT *, images.*, articles.*
FROM categories
-- and so on with joins, orders, etc...
SQL
result = ActiveRecord::Base.connection.execute(query)
我真的不鼓励这个选项,因为它会带来很多重复的信息,因为您将加入三个表,并且对它们进行排序以供您使用真的很痛苦。
您可以在 rails Article.includes(:Category) 中尝试“包含”