count query - 如何获取关系而不是hash

时间:2016-07-29 10:39:32

标签: ruby-on-rails ruby-on-rails-4

我有这样的模型结构:

class Forum < ActiveRecord::Base
  has_many :topics

class Topic < ActiveRecord::Base
  has_many :posts
  belongs_to :forum

class Post < ActiveRecord::Base
  belongs_to :topic
  has_many :post_links
  has_many :links, ->{ uniq }, through: :post_links, dependent: :destroy

class PostLink < ActiveRecord::Base
  belongs_to :post
  belongs_to :link

class Link < ActiveRecord::Base
  has_many :post_links
  has_many :posts, ->{ uniq }, through: :post_links, dependent: :destroy

现在我想从id = 1获取来自论坛的所有链接,并根据它们在此论坛的帖子中显示的频率排序。

Link.joins(posts: [topic: :forum]).where("forums.id = ?",1).group("links.id").order("count_all DESC").count

它给我像{140 => 10, 12 => 9, 137 => 8}

这样的哈希值

我想使用Link关系而不是使用ids的哈希,但我不确定如何更改此查询。

3 个答案:

答案 0 :(得分:0)

由于您从最大分组ID's获取计数,因此无法直接获取有效记录关系,但

您只需从返回的结果中where中触发Link model条件即可获得Active record association

Link.where(id: (Link.joins(posts: [topic: :forum]).where("forums.id = ?",1).group("links.id").order("count_all DESC").count).keys)

返回,

 #<ActiveRecord::Relation [#<Link...]

答案 1 :(得分:0)

我设法用这个查询来解决它:

Link.joins(posts: [topic: :forum]).where("forums.id = ?",1)
       .group("links.id").order("count_links_id DESC")
       .select("links.*, COUNT(links.id) AS count_links_id")

答案 2 :(得分:0)

在查询中使用select应返回ActiveRecord :: Relation。试试这个:

Link.select("links.*, COUNT(links.id) as link_count").joins(posts: [topic: :forum]).where("forums.id = ?",1).group("links.id").order("link_count DESC").count

由于我没有你的模型结构和关系,我无法测试这个,但我用类似的查询做到了。使用select您将获得一个关系。 links.*将返回Link模型的所有列/属性。如果您只需要特定属性(例如链接的网址),请改用link.url