我有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)
答案 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