2009-06-23 12 views
3

Ist es in Ruby/Rails möglich, eine Ergebnismenge nach einem Fund zu ordnen? Zum Beispiel ist es möglich, so etwas wie dieseKannst du eine Bestellung in Ruby nach einem Fund machen?

Warnung zu tun: nicht

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

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

ich etwas würde davon ausgehen, Funktioniert wie dies möglich sein soll, aber ich bin immer noch sehr neu in RoR und kann bei Google finde ich nichts.

Antwort

4

Ich weiß nicht, warum alle "Nein, du kannst nicht", wenn es in den genannten Bereichen möglich ist.

Zum Beispiel definieren als Teil der Activerecord :: Base:

named_scope :by_created_at, :order_by => 'created_at' 

Dies ermöglicht Ihnen eine einfache Beziehung zu einer geordneten ein konvertieren, bevor es tatsächlich abgerufen wird:

@items = @items.by_created_at 

Als Beachten Sie, dass es keine gute Idee ist, Bereiche mit Überschneidungen einzubeziehen: Reihenfolgedefinitionen, da diese dazu führen, dass sie angehängt werden, anstatt sie nacheinander zu übersteuern.

jedoch in Ihrem Beispiel ist es nicht zu viel von einer Strecke, sich vorzustellen, es als die folgende Refactoring:

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

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

Sie sollten in der Lage sein, eine von ihnen zu tun:

sortieren, wenn zugegriffen:

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

Sortieren nach dem Zugriff:

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

Sie auch die Symbol to Proc shorthand in Schienen nutzen könnten, zusammen mit Enumerable#sort_by, um Ihre Sortieranweisung zu vereinfachen, wenn Sie nach dem Sammeln von ActiveRecord-Objekten sortieren möchten:

@items.sort_by(&:created_at) 
# is the same as @items.sort{ |a, b| a.created_at <=> b.created_at } 
Verwandte Themen