9

次のようなオブジェクトがあります。

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

sentence長さで並べ替えるにはどうすればよいですか?

私の最終的な目標は、誰かがレッスンで漢字をクリックすると、その文字の意味のヒントとして利用できる最も短い例文がいくつか表示されるようにすることです。

私はPostgreSQLを使用しています。

4

5 に答える 5

18

Sameera207 は正しい考えを持っていますが、答えは Ruby コードとして提供します。

Hint.where("sentence LIKE ?","%你%").order("LENGTH(sentence) ASC")

これで問題が解決します

おそらく、このような方法が必要です。

def shortest_example(word)
  Hint.where("sentence LIKE ?", "%#{word}%").order("LENGTH(sentence) ASC").first
end
于 2013-01-06T19:45:11.047 に答える
6

簡単な方法は、MySQL の例として、DB 側から並べ替えを行うことだと思います。

order by LENGTH(sentence) desc

このためのスコープを作成することもできます。

ご覧のとおり、DB 選択後にソートしようとすると、不要な別のループになるためです。

于 2013-01-06T19:34:53.667 に答える
4

この種:

hints = hints.sort { |x,y| x.sentence.length <=> y.sentence.length }

仕事をします

于 2013-01-06T19:44:59.917 に答える
2

試す

hints = Hint.find_by_sql("SELECT * FROM hints WHERE sentence LIKE('%你%') ORDER BY LENGTH(sentence) ASC")
于 2013-01-06T19:35:22.027 に答える