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



我有一个像这样的对象:

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

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

我认为最简单的方法是从DB端进行排序,如MySQL中的示例:

order by LENGTH(sentence) desc

甚至可以为此编写一个作用域。

因为正如我所看到的,如果你试图在DB选择之后对它进行排序,它将是另一个不必要的循环。

this sort:

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

就可以了

Try

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

我无法获得。order在我的rails查询中工作。我需要使用。reorder代替,这是为模型的子。

doc_glossaries = doc.doc_glossaries.where(active: true, trashed: false).reorder("LENGTH(src) DESC")

相关内容

  • 没有找到相关文章

最新更新