如何按属性长度对ActiveRecords列表进行排序?

web*_*ets 8 ruby activerecord ruby-on-rails ruby-on-rails-3 rails-postgresql

我有一个像这样的对象:

irb(main):076:0> hints = Hint.where("sentence LIKE ?","%?%")
  Hint Load (4.0ms)  SELECT "hints".* FROM "hints" WHERE (sentence LIKE '%?%')
[
    [0] #<Hint:0x007fb99c6520b8> {
                :id => 214,
          :sentence => "?????????????????????????",
              :user => nil,
           :learned => nil,
        :created_at => Sun, 06 Jan 2013 18:14:33 UTC +00:00,
        :updated_at => Sun, 06 Jan 2013 18:14:33 UTC +00:00
    },
    [1] #<Hint:0x007fb99c659a70> {
                :id => 229,
          :sentence => "??????????????????????“???????????????????????”?",
              :user => nil,
           :learned => nil,
        :created_at => Sun, 06 Jan 2013 18:43:23 UTC +00:00,
        :updated_at => Sun, 06 Jan 2013 18:43:23 UTC +00:00
    },
    [2] #<Hint:0x007fb99c659458> {
                :id => 234,
          :sentence => "??????????",
              :user => nil,
           :learned => nil,
        :created_at => Sun, 06 Jan 2013 18:48:12 UTC +00:00,
        :updated_at => Sun, 06 Jan 2013 18:48:12 UTC +00:00
    }
]
irb(main):077:0> hints.class
ActiveRecord::Relation < Object
Run Code Online (Sandbox Code Playgroud)

我该如何按sentence长度排序?

我的最终目标是,当有人点击课程中的中文字符时,他们将会看到一些最短的例句,作为对字符含义的暗示.

我正在使用PostgreSQL.

Mat*_*udy 15

Sameera207有正确的想法,但作为ruby代码给你答案.

Hint.where("sentence LIKE ?","%?%").order("LENGTH(sentence) ASC")
Run Code Online (Sandbox Code Playgroud)

这将解决您的问题

也许你想要一个像这样的方法;

def shortest_example(word)
  Hint.where("sentence LIKE ?", "%#{word}%").order("LENGTH(sentence) ASC").first
end
Run Code Online (Sandbox Code Playgroud)


sam*_*207 5

我认为简单的方法是从数据库端进行排序,例如在MySQL中:

order by LENGTH(sentence) desc
Run Code Online (Sandbox Code Playgroud)

即使您可以为此编写范围。

因为正如我所看到的,如果您要在选择数据库之后尝试对其进行排序,那么它将是另一个不必要的循环。


mas*_*ily 5

这种:

hints = hints.sort { |x,y| x.sentence.length <=> y.sentence.length }
Run Code Online (Sandbox Code Playgroud)

会做的工作