在ActiveRecord中找到5个最长的名称

时间:2015-09-03 16:42:17

标签: activerecord

假设我有一篇包含数千篇文章的文章表。我试图找出最有效的方法来找到5个最长的文章名称,而不是文章本身。

这是我到目前为止所做的:

def self.five_longest_article_names
  limit(5).order("(LENGTH(name)) desc").pluck(:name)
end

但是那使用SQL。是否有我可以执行的ActiveRecord查询?

2 个答案:

答案 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)

我建议您将其作为命名范围传递给您的模型,并从那里连接调用。