0

这将显示在侧边栏中,这就是我将它放在应用程序控制器中的原因。我对更好的解决方案持开放态度

class ApplicationController < ActionController::Base

  protect_from_forgery

  before_filter :get_tags_latest, :get_tags_popular

  def get_tags_latest
    @tags_latest = Tag.all.first(5)
  end

  def get_tags_popular
    @tags_popular = Tag.by_most_resources.limit(10)
  end

end

标签.rb:

class Tag < ActiveRecord::Base

  self.include_root_in_json = false

  has_many :resource_tags
  has_many :resources, :through => :resource_tags

  attr_accessible :name

  validates :name, :presence => true,
                   :length   => { :within => 2..20 },
                   :uniqueness => { :case_sensitive => false }

  scope :by_most_resources,
    joins("INNER JOIN resources ON resources.tag_id = tags.id").
    group("tags.*").order("count(resources.id) DESC")

end

sidebar.html.erb

<ul class="tag-list">
    <% @tags_popular.each do |t| %>
      <li><%= link_to t.name, tag_path(t), :class => :tag %> (<%= t.resources.count %>)</li>
    <% end %>
  </ul>

目前我没有太多代码(希望它也在正确的位置)......我真正想做的就是显示按 tag.resources.count 排序的最受欢迎的 10 个标签,以及最新的 5 个标签按日期排序。我试着四处寻找 find(:order => ) 但事实证明这无济于事。

有没有神奇的方法可以做到这一点?谢谢

4

1 回答 1

1

从 SQL 开始

SELECT tags.*
FROM tags
  INNER JOIN resources ON resources.tag_id = tags.id
GROUP BY tags.*
ORDER BY count(resources.id) DESC
LIMIT 10

所以,要 ActiveRecordize 这个...

class Tag < ActiveRecord::Base
  scope :by_most_resources,
    joins("INNER JOIN resources ON resources.tag_id = tags.id").
    group("tags.*").order("count(resources.id) DESC")

通过以下方式调用:

Tag.by_most_resources.limit(10)
于 2012-04-12T21:01:06.683 回答