2009-09-13 51 views
1

我有一個名爲name(在數據庫中)字段的ActiveRecord模型和名爲collation_name(不在數據庫中)的方法,該方法返回縮減版本的名稱。該模型類類似於此:在ActiveRecord中查找按方法排序的所有行

class Foo < ActiveRecord::Base 

    # ... other stuff ... 

    def collation_name 
    words = name.downcase.split 
    if words[0] == 'the' 
     words.shift 
    end 
    words.join(' ') 
    end 
end 

我的應用程序用於應用程序數據庫導出到包含數據,包括collation_name作爲一個真正的列的非規範化版本的第二數據庫。我想用collation_name來訂購記錄,以便在應用程序的視圖中顯示。我試過Foo.all(:order=>:collation_name),但得到了'no such column:collat​​ion_name'錯誤。

如何獲得排序的Foo記錄列表?是否需要將collation_name作爲ActiveRecord的應用程序數據庫中的實際列添加以在訂購時查看它?在ActiveRecord返回結果後,我應該在應用程序代碼中排序嗎?

回答

3

如果你只需要對付行有限數量的排序中您的應用程序是這樣的:

class Foo 

    attr_accessor :name 

    def initialize(name) 
    self.name = name 
    end 

    def collation_name 
    name 
    end 

    def <=>(other) 
    collation_name <=> other.collation_name 
    end 

end 

# create 10 foos 
foos = Array.new(10).map { |e| Foo.new(rand(100_000).to_s) } 
p foos # foos are unsorted 
p foos.sort # foos are sorted 

# alternative: use a closure to sort 
Foo.send :remove_method, '<=>'.to_sym 
p foos.sort { |a,b| a.collation_name <=> b.collation_name } # sorted again 

如果你想使用ActiveRecord訂購的結果集,你需要有存在於數據庫中的列。無論是

  • 使用其導出爲你的結果(基本上你使用Ruby中相同的代碼)的功能,使通過把它在一個視圖其結果集的一部分(例如,查詢使用視圖:從)
  • 計算數據,並存儲在數據庫中(非規範化它,就像你說的)
+0

我的問題是關於我是否可以使用ActiveRecord庫進行排序。我編輯了這個問題,希望能夠更清楚地說明問題。 – 2009-09-13 18:26:50

+0

爲解釋澄清而編輯。 – yawn 2009-09-13 19:19:39

1

爲了順序工作,您必須使用由.all方法創建的查詢中已知的列,或者必須重載類中的.all方法以添加缺少的功能。

從你的問題,我不知道你的數據庫是如何看起來像,因此它是不能辨別你可以用於:列順序。如果您所期望的順序不能通過rails構建的sql查詢達到,您可能必須使用ruby命令將所得到的.all方法的數組排序。

+0

數據庫表匹配的模型類有ID(整數),名(字符串),以及其他一些領域。 – 2009-09-13 18:13:54

相關問題