我有一个这样的对象:
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。
答案 0 :(得分:13)
Sameera207有正确的想法, 但是给你答案就像红宝石代码一样。
Hint.where("sentence LIKE ?","%你%").order("LENGTH(sentence) ASC")
这将解决您的问题
也许你想要一个像这样的方法;
def shortest_example(word)
Hint.where("sentence LIKE ?", "%#{word}%").order("LENGTH(sentence) ASC").first
end
答案 1 :(得分:4)
这种:
hints = hints.sort { |x,y| x.sentence.length <=> y.sentence.length }
将完成这项工作
答案 2 :(得分:3)
我认为简单的方法是从数据库端进行排序,例如在MySQL中:
order by LENGTH(sentence) desc
即使你可以为此写一个范围。
因为我可以看到,如果您在DB选择之后尝试对其进行排序,那么这将是另一个不必要的循环。
答案 3 :(得分:2)
尝试
hints = Hint.find_by_sql("SELECT * FROM hints WHERE sentence LIKE('%你%') ORDER BY LENGTH(sentence) ASC")
答案 4 :(得分:0)
我无法在Rails查询中获得.order的工作。我需要使用.reorder代替,这是给模型的孩子使用的。
例如
doc_glossaries = doc.doc_glossaries.where(active: true, trashed: false).reorder("LENGTH(src) DESC")