2015-06-11 622 views
1

这限制了最高标记计数标签的前20名:如何通过DESC命令.limit命令,然后按(:id)命令?

tag.rb

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

我希望再下订单的20根据自己:id,而不是由他们的tagging_count

application_controller

before_action :tag_cloud 
def tag_cloud 
    @tags = Tag.all.top_20.order(:id) 
end 

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

请让我知道如果您需要进一步代码或解释帮你帮我: - ]

回答

2

查询只需要第一order考虑中的任何一个写的范围。你可以用reorder覆盖它,但这不适用于你的情况,因为它将覆盖order("taggings_count DESC")

你的作品是sort

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

+0

非常感谢你@Abm一直在这一段时间:) –

+0

@ AnthonyGalli.com你正在寻找这一个..该死! –

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 
1

我宁愿重写这样的范围:

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

这样做有什么修改FROM -clause不从'tags'表中提取结果,而是从一个临时的结果集别名具有相同的名称(在子查询牵强)(只是table_name返回)愚弄ActiveRecord认为我们正在查询同一来源。您可以在顶部应用任何操作,就像它是整个表一样。

至于as -method,这似乎没有提及任何地方......它来自Arel,ActiveRecord中使用的SQL AST管理器。实际上,它被委托给查询的Arel::SelectManager,可通过arel方法在任何ActiveRecord::Relation上获得。

+0

酷...我不知道'作为'方法..给我看API链接.. –

+1

@ArupRakshit,可能来自Arel,我只是试过它而已工作。即使如此,您可以将别名从''from'作为第二个参数,它的功能几乎相同。 –

+1

@ArupRakshit它确实来自Arel。代表团已生效。更完整的形式是'.arel.as(table_name)' –