假设我有一篇包含数千篇文章的文章表。我试图找出最有效的方法来找到5个最长的文章名称,而不是文章本身。
这是我到目前为止所做的:
def self.five_longest_article_names
limit(5).order("(LENGTH(name)) desc").pluck(:name)
end
但是那使用SQL。是否有我可以执行的ActiveRecord查询?
答案 0 :(得分:2)
YourModel.limit(5).order("CHAR_LENGTH(name) desc").pluck(:name)
所以,你的方法变成了:
def self.five_longest_article_names
limit(5).order("CHAR_LENGTH(name) desc").pluck(:name)
end
您可以使用Arel
,但Arel
适用于复杂查询。在您的情况下,这是一个简单的用例,我认为在这种特殊情况下使用SQL
会更好。
答案 1 :(得分:0)
您始终可以为arel:
创建自己的名称功能my_length = Arel::Nodes::NamedFunction.new('LENGTH', YourModel.table[:name])
YourModel.order(Arel::Nodes::Descending.new(my_length)).limit(5)
# or
YourModel.order("#{my_length.to_sql} DESC").limit(5)
我建议您将其作为命名范围传递给您的模型,并从那里连接调用。