提取包括ActiveRecord :: Relation的关联

时间:2016-06-23 15:46:35

标签: ruby-on-rails

我有2个型号:

class Author < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :author
end

我们说我有10篇文章由3位作者撰写。

我的查询是这样的:

articles = Article.includes(:author).all

这将导致2个查询:

Select * from articles limit 10;
Select * from authors where id IN (...)

如何以更优雅的方式从文章中提取作者:

articles.map(&:user).uniq(&:id)

用例是显示带有2个键,消息和用户的json

json.articles(articles, :id, :author_id, :title, :created_at)
json.authors(articles.map(&:author).uniq(&:id), :id, :name)

1 个答案:

答案 0 :(得分:0)

如何通过ActiveRecord SELECT DISTINCT方法使用uniq?请注意,这与您使用的Array uniq方法不同,尽管名称相同。

Author.joins(:articles).group(:id).uniq

这会产生类似

的内容
SELECT DISTINCT `authors`.* FROM `authors` INNER JOIN `articles` ON `articles`.`author_id` = `authors`.`id` GROUP BY `authors`.`id`

如果您需要限制文章查询,可以使用merge

Author.joins(:articles).merge(Article.where(...)).group(:id).uniq