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