2015-06-11 247 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)' –