0

我希望有人可以帮助我解决这个问题,现在已经尝试了一个星期,我找到了很多例子,但是由于我是 Rails 新手,我想我一直在某个地方犯错,我就是找不到适合我的情况的正确解决方案。所以我有:

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 %>
4

1 回答 1

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 %>
于 2013-01-21T14:36:04.087 回答