2015-06-11 5 views
1

Это ограничивает теги в топ-20 с наибольшим кол-тегов:Как оформить заказ по DESC, а затем заказать по (: 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

Не очень ясно о вашем вопросе, вы хотите заказать запись как по убыванию или по порядку?

Напишите областей следующим образом

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 -метода, это, кажется, нигде не упоминается ... оно происходит от Ареля, менеджера SQL AST, используемого в ActiveRecord под капотом. Фактически, он делегирован запросу Arel::SelectManager, доступному по методу arel на любом ActiveRecord::Relation.

+0

Прохладный ... Я не знал 'как' метод .. показать мне ссылку API .. –

+1

@ArupRakshit, что можно быть из Ареля, я просто попробовал, и это работал. Тем не менее, вы можете дать 'from' псевдоним имя в качестве второго аргумента, и он будет работать почти так же. –

+1

@ArupRakshit это действительно из Ареля. Делегация действует. Более полная форма - '.arel.as (table_name)' –

 Смежные вопросы

  • Нет связанных вопросов^_^