【问题标题】:has_many , through: relationship counthas_many ,通过:关系计数
【发布时间】:2013-01-21 14:28:57
【问题描述】:

我希望有人可以帮助我解决这个问题,我已经尝试了一个星期,我找到了很多示例,但是由于我是 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 %>

【问题讨论】:

    标签: mysql ruby-on-rails database


    【解决方案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 %>
    

    【讨论】:

    • 谢谢你,我尝试了你的建议。我现在在 blogs_controller 中有 @blogs = Blog.includes(:messages_blogs => :message)....limit(3) ,正如你所说的 在查看博客,这是我得到的错误: BlogMysql2::Error: Unknown column 'message_count' in 'order Clause': SELECT DISTINCT blogs.id FROM blogs LEFT OUTER JOIN messages_blogs ON messages_blogs.@ 987654328@ = blogs.id 左外连接 messages ON messages.id = messages_blogs.message_id GROUP BY blog.id ORDER BY message_count DESC LIMIT 3
    • 哇,这太奇怪了,你确定你在查询中使用了select 子句和COUNT(messages.id) AS message_count 吗?
    • @user1834992 我刚刚更新了我的答案(更改了连接和选择的顺序)。让我知道它现在是否有效
    • @user1834992 尝试删除选择选项并修改订单选项,如下所示:order('COUNT(messages.id) DESC')
    • 尝试了新方法,当我加入时,它给出了这个错误:未找到名为“消息”的关联;也许你拼错了?并且包括像以前一样给出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2012-06-12
    • 2011-09-11
    相关资源
    最近更新 更多