【问题标题】:How to .limit order by DESC, then order by (:id)?如何通过 DESC 限制订单,然后通过 (:id) 进行订单?
【发布时间】:2015-06-11 17:28:32
【问题描述】:

这将标签限制为标签数量最多的前 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 %>

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

【问题讨论】:

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


    【解决方案1】:

    如果您想使用纯 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 &lt;=&gt; y.id }

    【讨论】:

    • 非常感谢@Abm 关注了一段时间 :)
    • @AnthonyGalli.com 你在找这个..该死的!
    【解决方案3】:

    我宁愿这样重写这个作用域:

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

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

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

    【讨论】:

    • @ArupRakshit 可能来自 Arel,我刚试了一下,效果很好。即使这样,您也可以将别名 from 作为第二个参数,它的工作原理几乎相同。
    • @ArupRakshit 它确实来自 Arel。委托生效。更完整的表格是.arel.as(table_name)
    【解决方案4】:

    对你的问题不是很清楚,你想按 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2014-07-30
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多