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)