has_many,通过:关系计数

时间:2013-01-21 14:28:57

标签: mysql ruby-on-rails database

我希望有人可以帮我解决这个问题,一直试图解决这个问题,我发现了很多例子,但是因为我是铁杆新手所以我想我在某个地方犯了一个错误我只是无法为我的案件找到合适的解决方案。 所以我有:

class Blog < ActiveRecord::Base
   attr_accessible :name, :subject_id, :created_at
   has_many :blogs_messages
   has_many :messages, through: :blogs_messages
end

class Message < ActiveRecord::Base
   attr_accessible :title, :body, :created_at
   has_many :blogs_messages
   has_many :blogs, through: :blogs_messages
end

class BlogsMessages < ActiveRecord::Base
  attr_accessible :message_id, :blog_id
  belongs_to :blog
  belongs_to :message
end

消息存在于不同的博客(如粉红博客,绿色博客,栗色博客等),博客生活在主题(深色,鲜艳的色彩等) 主题有很多博客,但博客只能属于一个主题。

BlogsMessages是消息和博客之间的连接 我想做的是显示:  在一个主题中排名前3的博客(按其中的邮件数量)

所以,例如当我想选择主题暗色时它会告诉我:

    1.Maroon Blog: 46 messages
    2.Grey Blog: 13 messages
    3.Purple Blog: 12 messages 

(主题暗色中共有8个博客。)

有人可以帮助我,或者至少指出我正确的方向如何使一切工作?

更新

在我的Blogs_controller现在我有:

@blogs = Blog.joins(:blogs_messages => :message).select('blogs.*, COUNT(messages.id) AS message_count').group('blog_id').order('COUNT(messages.id) DESC').limit(3)

在我的博客视图中:

    <% @blogs.each do |blog| %>
      <li><%= blog.name %>:  messages</li>
    <% end %>

1 个答案:

答案 0 :(得分:1)

我不确定这是否可行,因为我无法测试它,但它可以帮助你:

 Blog.where(subject_id: subject.id)
      .joins(:blogs_messages => :message)
      .select('blogs.*, COUNT(messages.id) AS message_count')
      .group(:blog_id)
      .order('message_count DESC')
      .limit(3)

此外,在视图中,您可以访问新的虚拟属性message_count

 <% @blogs.each do |blog| %>
   <li><%= blog.name %>: <%= blog.message_count %> messages</li>
 <% end %>