如何按 DESC 限制订单,然后按 (:id) 订购?
How to .limit order by DESC, then order by (:id)?
这将标签限制为标签计数最高的前 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
不幸的是,.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 %>
如果您需要进一步的代码或解释来帮助我,请告诉我:-]
你的问题不是很清楚,你是要将记录排序为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
查询将只考虑第一个 order
。您可以使用 reorder 覆盖它,但这在您的情况下不起作用,因为它将覆盖 order("taggings_count DESC")
.
适合你的是 sort:
@tags = Tag.all.top_20.sort{ |x,y| x.id <=> y.id }
如果您想使用纯 SQL 而不是使用 Ruby sort
来执行此操作,则必须使用子查询来执行此操作:
Tag.from(Tag.top_20, :tags).order(:id)
http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from
我宁愿像这样重写这个范围:
from(
where.not(taggings_count: 0)
.order(taggings_count: :desc)
.limit(20)
.as(table_name)
)
它所做的是修改一个 FROM
-子句来获取结果,而不是从 'tags'
table,而是从一个临时结果集(在 子查询中获取) ) 别名具有相同的名称(table_name
returns 就是这样)来欺骗 ActiveRecord,使其认为我们正在查询相同的源。您可以在顶部应用任何操作,就好像它是一个整体 table.
至于 as
方法,似乎在任何地方都没有提及...它来自 Arel,后者是 ActiveRecord 中使用的 SQL AST 管理器。事实上,它被委托给查询的 Arel::SelectManager
,可用于任何 ActiveRecord::Relation
.
的 arel
方法
这将标签限制为标签计数最高的前 20 个标签:
tag.rb
scope :top_20, -> {
where("taggings_count != 0").order("taggings_count DESC").limit(3)
}
然后我想根据他们的 :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 %>
如果您需要进一步的代码或解释来帮助我,请告诉我:-]
你的问题不是很清楚,你是要将记录排序为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
查询将只考虑第一个 order
。您可以使用 reorder 覆盖它,但这在您的情况下不起作用,因为它将覆盖 order("taggings_count DESC")
.
适合你的是 sort:
@tags = Tag.all.top_20.sort{ |x,y| x.id <=> y.id }
如果您想使用纯 SQL 而不是使用 Ruby sort
来执行此操作,则必须使用子查询来执行此操作:
Tag.from(Tag.top_20, :tags).order(:id)
http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from
我宁愿像这样重写这个范围:
from(
where.not(taggings_count: 0)
.order(taggings_count: :desc)
.limit(20)
.as(table_name)
)
它所做的是修改一个 FROM
-子句来获取结果,而不是从 'tags'
table,而是从一个临时结果集(在 子查询中获取) ) 别名具有相同的名称(table_name
returns 就是这样)来欺骗 ActiveRecord,使其认为我们正在查询相同的源。您可以在顶部应用任何操作,就好像它是一个整体 table.
至于 as
方法,似乎在任何地方都没有提及...它来自 Arel,后者是 ActiveRecord 中使用的 SQL AST 管理器。事实上,它被委托给查询的 Arel::SelectManager
,可用于任何 ActiveRecord::Relation
.
arel
方法