Ich tue Folgendes:
offers = v.offers.sort { |a,b| a.expires <=> b.expires }
Diese Daten werden über ActiveResource geladen (so dass jeder Satz von Instanzattributen durch die darin enthaltenen Daten definiert ist). Durch eine kürzliche Änderung in den eingehenden Daten wurde das Attribut "expires" jedoch optional. Gibt es eine Änderung der Klassendefinition, die bewirkt, dass die Sortiermethode einen Standardwert verwendet, wenn das Attribut in einer Instanz fehlt?
bearbeiten: @Nikita
Es sieht so aus, als ob es nicht so einfach wäre:
o.expires == nil?
NoMethodError: undefined method `expires' for #<Offer:0x00000100d3faa8>
o.expires?
=> nil
Also habe ich es versucht:
offers.sort{|a,b|
if a.expires?
b.expires? ? 0 : -1
else
b.expires? ? 1 : a.expires <=> b.expires
end
}
NoMethodError: undefined method `expires' for #<Offer:0x00000100d3faa8>
Ich hatte gehofft, die Klassendefinition mit etwas wie aktualisieren zu können:
expires ||= ""
... aber ich weiß nicht, ob das möglich ist. Ich verstehe allerdings noch nicht ganz, wie die Sortierblöcke funktionieren. Ich weiß, ich könnte nur Schleife durch die Angebote und weisen Sie den Wert, aber es scheint grob ineffizient.
Update
offers.sort{|a,b|
if defined? a.expires == nil
(defined? b.expires == nil) ? 0 : -1
else
(defined? b.expires == nil) ? 1 : a.expires <=> b.expires
end
}
ArgumentError: comparison of Offer with Offer failed
from (irb):70:in `sort'
from (irb):70
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands/console.rb:47:in `start'
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands/console.rb:8:in `start'
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Ein Hoch auf die Weitschweifigkeit ;p