2009-06-23 5 views
3

ルビー/レールで検索後に結果セットを注文することは可能ですか?見つけることができます:ルビーの中で注文?

if type == 1 
    @items = mycompany.items 
else 
    @items = myhome.items 
end 

@items = @items :order => "created_at" 

を動作しません、私はこのようなものが可能であるべきと仮定だろうが、私はまだRoRのに非常に新しいですし、次のことができます。例えば、それはこの

警告のような何かを行うことが可能ですGoogleでは何も見つからないようだ。

答えて

4

名前付きスコープですべての人が「いいえ」できない理由はわかりません。

例えば、ActiveRecordの::ベースの一部として定義しますよう

@items = @items.by_created_at 

named_scope :by_created_at, :order_by => 'created_at' 

これは、それが実際に取得される前にあなたが注文したものに単純な関係に変換することができますオーバラップしているスコープを含めることは良い考えではないことに注意してください。オーダー定義は、オーバライドの代わりに追加されます。

しかし、あなたの例では、それは以下のようにそれをリファクタリング想像するストレッチのあまりありません。

reference = 
    case (type) 
    when 1 
    mycompany 
    else 
    myhome 
    end 

@items = reference.items.all(:order_by => 'created_at') 
6

あなたはこれらのいずれかを実行することができるはずです。

並び替えアクセスしたときに:アクセスした後

if type == 1 
    @items = mycompany.items(:order => 'created_at') 
else 
    @items = myhome.items(:order => 'created_at') 
end 

並べ替え:

@items.sort{|a,b| a.created_at <=> b.created_at} 
5

をあなたはまた、レールで利用可能Symbol to Proc shorthandを使用することができ、 Enumerable#sort_byと一緒にソートステートメントを単純化してください。ActiveRecordオブジェクトを収集した後にソートする場合は、

@items.sort_by(&:created_at) 
# is the same as @items.sort{ |a, b| a.created_at <=> b.created_at } 
関連する問題