如何通过DESC限制。然后按(:id)排序?

时间:2015-06-11 17:28:33

标签: ruby-on-rails ruby tags tag-cloud

这会将标签限制在前20位,标签数量最多:

tag.rb

scope :top_20, -> {
  where("taggings_count != 0").order("taggings_count DESC").limit(3)
}

我想根据他们的:id而不是他们的tagging_count来订购这20个

application_controller

before_action :tag_cloud
def tag_cloud
  @tags = Tag.all.top_20.order(:id)
end
遗憾的是,{p> .order(:id)并不起作用。它们仍然按计数降序显示。

_tags.html.erb

<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
  <%= link_to tag.name, tag_path(tag), :class => css_class %>
<% end %>

如果您需要进一步的代码或解释,请告知我们,以帮助您: - ]

4 个答案:

答案 0 :(得分:3)

如果要使用纯SQL而不是使用Ruby sort来执行此操作,则必须使用子查询执行此操作:

Tag.from(Tag.top_20, :tags).order(:id)

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from

答案 1 :(得分:2)

查询只会考虑第一个order。您可以使用reorder覆盖它,但这不适用于您的情况,因为它会覆盖order("taggings_count DESC")

对您有用的是sort

@tags = Tag.all.top_20.sort{ |x,y| x.id <=> y.id }

答案 2 :(得分:1)

我宁愿像这样重写这个范围:

from(
  where.not(taggings_count: 0)
     .order(taggings_count: :desc)
     .limit(20)
        .as(table_name)
)

这样做是修改FROM - 子句来获取不是来自'tags'表的结果,而是来自一个临时结果集(在子查询中获取)别名相同的名称(table_name只返回那个)来欺骗ActiveRecord,让我们认为我们要查询同一个来源。您可以在顶部应用任何操作,就好像它是整个表格一样。

对于as - 方法,似乎没有在任何地方提及......它来自Arel,ActiveRecord中使用的SQL AST管理器。事实上,它已被委托给查询Arel::SelectManagerarel方法可用于任何ActiveRecord::Relation

答案 3 :(得分:0)

您的问题不太清楚,您是否想以desc或asc命令订购记录?

编写范围如下

scope :order_id_asc, -> { order('id ASC') }
scope :order_id_desc, -> { order('id DESC') }

重新编写代码如下,调用任何一个范围

def tag_cloud
    @tags = Tag.top_20.order_id_asc
end