How can I sort an ActiveRecords list by attribute length?

I have an object like this:

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 

How can I sort sentence length?

My ultimate goal is to make sure that when someone clicks on a Chinese character in the lesson, they will be shown some of the shortest example sentences available as a hint to the meaning of the character.

I am using PostgreSQL.

+6
source share
4 answers

this grade:

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

will complete the task

+5
source

Sameera207 has the right idea, but giving you the answer as ruby ​​code.

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

This will solve your problem.

Perhaps you need a method like this:

 def shortest_example(word) Hint.where("sentence LIKE ?", "%#{word}%").order("LENGTH(sentence) ASC").first end 
+12
source

I think the easy way is to do your sorting from the end of the DB, as an example in MySQL:

 order by LENGTH(sentence) desc 

even you could write an area for this.

Because, as I see it, if you try to sort it after selecting the database, it will be a different cycle that is not needed.

+2
source

Try

 hints = Hint.find_by_sql("SELECT * FROM hints WHERE sentence LIKE('%你%') ORDER BY LENGTH(sentence) ASC") 
+2
source

All Articles