1
class Category
  has_many :images
  has_many :articles
end

class Image
  belongs_to :category
end

class Article
  belongs_to :category
end

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

例如,我想获取属于同一类别的所有图像和文章,并按created_at.

4

3 回答 3

0

正如我所说,在我看来,您可以使用急切加载多个关联。在你的情况下,它可能是这样的:

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

基本上,您传递所需的CategoryID 并获取:images, :articles具有belongs_to特定 ID 的类别。sort_by可能应该做排序的事情。

这篇关于急切加载的博客文章也可以为您提供帮助。

于 2017-05-28T18:19:01.757 回答
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,这对于 ORM 的易用性是一个很好的折衷。 现在,如果您坚持在一个查询中包含所有这些信息,那么肯定它一定是使用Arel的一种方式,但如果值得,请三思。我看到的最后一个选择是好的旧 SQL:imagesarticles

query = <<-SQL 
  SELECT *, images.*, articles.* 
  FROM categories
  -- and so on with joins, orders, etc...
SQL

result = ActiveRecord::Base.connection.execute(query)

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

于 2017-05-28T18:22:25.597 回答
0

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

于 2017-05-27T19:37:17.147 回答