Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails/ActiveRecord:我可以在不将SQL字符串传递给#order的情况下执行此查询吗?_Sql_Ruby On Rails_Activerecord_Rails Activerecord - Fatal编程技术网

Rails/ActiveRecord:我可以在不将SQL字符串传递给#order的情况下执行此查询吗?

Rails/ActiveRecord:我可以在不将SQL字符串传递给#order的情况下执行此查询吗?,sql,ruby-on-rails,activerecord,rails-activerecord,Sql,Ruby On Rails,Activerecord,Rails Activerecord,我有两种型号Issue和Label。他们有一种多对多的关系 我有一个方法可以返回指向最多问题的十个标签 class Label < ApplicationRecord has_many :tags has_many :issues, through: :tags def self.top Label.joins(:issues) .group(:name) .order('count_id desc') .c

我有两种型号
Issue
Label
。他们有一种多对多的关系

我有一个方法可以返回指向最多问题的十个标签

class Label < ApplicationRecord
  has_many :tags
  has_many :issues, through: :tags

    def self.top
        Label.joins(:issues)
        .group(:name)
        .order('count_id desc')
        .count(:id)
        .take(10)
    end
end
我发现了一些SQL示例。我认为它基本上与按计数排序(Id)相同。:


是否可以在不传入SQL字符串的情况下执行相同的查询?仅使用ActiveRecord查询界面就可以完成此操作吗?

如果查看查询日志,您将看到如下内容:

select count(labels.id) as count_id ...
您的
调用(带有任何参数)和
计数(:id)
调用的组合将获取ActiveRecord,以将
计数id
列别名添加到查询中。我不认为在任何地方(至少我能找到)都有记录或指定这一点,但如果你有足够的勇气遍历活动记录源,你可以看到它的发生

通常,如果您先添加分组依据,然后添加
count(:x)
,活动记录将添加
count\u x
别名。此项没有列,因此您不能说
顺序(:count\u id)
顺序(count\u id::desc)
,或任何其他常见的非字符串替代项。好的,您必须使用字符串,但可以将其包装在
Arel.sql
中,以防止将来出现弃用问题:

Label.joins(:issues)
     .group(:name)
     .order(Arel.sql('count_id desc'))
     .count(:id)
     .take(10)
对此没有保证,因此如果您使用它,您应该在测试套件中包含一些内容,以便在将来行为发生变化时捕获任何问题

select count(labels.id) as count_id ...
Label.joins(:issues)
     .group(:name)
     .order(Arel.sql('count_id desc'))
     .count(:id)
     .take(10)