2009-09-13 10 views
1

nameというフィールド(データベース内)とcollation_name(データベースにはない)という名前のフィールドを持つ縮小レコードを返すActiveRecordモデルがあります。モデルクラスは、このようになります。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)を試しましたが、 'そのような列はありません:collat​​ion_name'というエラーがありました。

Fooレコードのリストは、collation_nameで注文できますか?注文時にActiveRecordのアプリケーションデータベースに実際の列としてcollation_nameを追加する必要がありますか? 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ライブラリで並べ替えを行うことができるかどうかについてです。私はそれを(うまくいけば)もっと明確にするために質問を編集しました。 –

+0

説明に応じて編集されました。 – yawn

1

注文するには:.allメソッドで作成されたクエリでわかっている列を使用するか、クラスに.allメソッドをオーバーロードして欠落している機能を追加する必要があります。

あなたの質問から、私はあなたのデータベースがどのように見えるかわからないので、どの列を使用できるか分かりません。 railsによって構築されたSQLクエリによって期待通りの順序に到達できない場合は、結果として得られる.allメソッドの配列をrubyで順序付けなければならないかもしれません。

+0

データベーステーブルは、ID(整数)、名称(文字列)、およびいくつかの他のフィールドを有している(あなたが言ったように、それを非正規化)データを計算し、データベースに格納。 –

関連する問題