2015-12-26 14 views
5

Ich stehe seit einiger Zeit vor diesem Problem, bitte schauen Sie es sich an.Wie Objekte nach Attributen sortiert werden?

object.inspect gibt mir diese Ausgabe

<RawMaterial id: nil, name: "Jam Button 9 mm Antique Silver", rate: 1.0, raw_material_wastage: 0.0, total_raw_material: 8.0, slug: nil, costing_id: nil, created_at: nil, updated_at: nil, inventory_item_id: 758, costing_wastage: 0.0, pick_from_order_sheet: false> 

Erhöhung object.to_yaml dieser Ausgang

-- !ruby/object:RawMaterial 
raw_attributes: 
    costing_id: 
    id: 
    name: Jam Button 9 mm Antique Silver 
    rate: '1' 
    raw_material_wastage: '0' 
    total_raw_material: '8' 
    slug: 
    created_at: 
    updated_at: 
    inventory_item_id: '758' 
    costing_wastage: '0' 
    pick_from_order_sheet: f 
attributes: !ruby/object:ActiveRecord::AttributeSet 
    attributes: !ruby/object:ActiveRecord::LazyAttributeHash 
    types: 
     id: &3 !ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer 
     precision: 
     scale: 
     limit: 
     range: !ruby/range 
      begin: -2147483648 
      end: 2147483648 
      excl: true 
     name: &2 !ruby/object:ActiveRecord::Type::String 
     precision: 
     scale: 
     limit: 255 
     rate: &1 !ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Float 
     precision: 
     scale: 
     limit: 
     raw_material_wastage: *1 
     total_raw_material: *1 
     slug: *2 
     costing_id: *3 
     created_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: &4 !ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::DateTime 
      precision: 
      scale: 
      limit: 
     updated_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *4 
     inventory_item_id: *3 
     costing_wastage: *1 
     pick_from_order_sheet: &5 !ruby/object:ActiveRecord::Type::Boolean 
     precision: 
     scale: 
     limit: 
    values: 
     id: '70' 
     name: Jam Button 9 mm Antique Silver 
     rate: '1' 
     raw_material_wastage: '0' 
     total_raw_material: '8' 
     slug: 
     costing_id: '34' 
     created_at: '2015-06-10 09:12:13.721016' 
     updated_at: '2015-06-10 09:12:14.075739' 
     inventory_item_id: '758' 
     costing_wastage: '0' 
     pick_from_order_sheet: f 
    additional_types: {} 
    materialized: true 
    delegate_hash: 
     costing_id: !ruby/object:ActiveRecord::Attribute::FromUser 
     name: costing_id 
     value_before_type_cast: 
     type: *3 
     value: 
     id: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: id 
     value_before_type_cast: 
     type: *3 
     value: 
     name: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: name 
     value_before_type_cast: Jam Button 9 mm Antique Silver 
     type: *2 
     value: Jam Button 9 mm Antique Silver 
     rate: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: rate 
     value_before_type_cast: '1' 
     type: *1 
     value: 1.0 
     raw_material_wastage: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: raw_material_wastage 
     value_before_type_cast: '0' 
     type: *1 
     value: 0.0 
     total_raw_material: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: total_raw_material 
     value_before_type_cast: '8' 
     type: *1 
     value: 8.0 
     slug: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: slug 
     value_before_type_cast: 
     type: *2 
     value: 
     created_at: !ruby/object:ActiveRecord::Attribute::FromUser 
     name: created_at 
     value_before_type_cast: 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *4 
     value: 
     updated_at: !ruby/object:ActiveRecord::Attribute::FromUser 
     name: updated_at 
     value_before_type_cast: 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *4 
     value: 
     inventory_item_id: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: inventory_item_id 
     value_before_type_cast: '758' 
     type: *3 
     value: 758 
     costing_wastage: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: costing_wastage 
     value_before_type_cast: '0' 
     type: *1 
     value: 0.0 
     pick_from_order_sheet: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: pick_from_order_sheet 
     value_before_type_cast: f 
     type: *5 
     value: false 
new_record: true 

I von created_at Wert bestellen möchten gibt, die ich immer bin, wenn raise object.to_yaml tun, wie kann das sein erledigt ?

+0

Verwendung 'RawMaterial.order (: created_at)' Auch wenn Sie nur einmal verwenden können Sie Ihr Objekt in die Datenbank (in Ihrer yaml Ausgabe beibehalten wird es zeigt new_record: true, was bedeutet, dass es nicht beibehalten wird, und das ist warum created_at ist zur Zeit null) – Kkulikovskis

+0

Ich möchte den Wert verwenden, den ich erhalte, wenn ich das object.to_yaml erstelle, es gibt einen Wert created_at, der nicht null ist, kann ich ihn verwenden? –

+0

Gibt es einen Grund, warum Sie das Objekt nicht in der Datenbank speichern möchten? Eine andere Version besteht darin, eine benutzerdefinierte Initialisierungsmethode in Ihrem Modell vorzunehmen und ein Attribut mit dem Wert "Time.now" zuzuweisen, wenn Sie an der Zeit interessiert sind, zu der das tatsächliche Objekt initiiert wurde. Verwenden Sie das Attribut, das Sie wollen, scheint extrem hackish – Kkulikovskis

Antwort

2

Wenn ich richtig verstehe, haben Sie eine Liste von Objekten des Typs RawMaterial. Sie können die Liste mit dem für jedes Objekt eindeutigen Objektfeld ['attributes']['attributes']['values']['created_at'] und der Methode Enumerable.sort_by sortieren.

enumerable_of_raw_materials.sort_by { |raw_material| 
    raw_material['attributes']['attributes']['values']['created_at'] 
} 
+0

Hallo, Mein Problem ist, dass. DUP-Methode created_at Wert nicht dupliziert. Ich bekomme den ganzen anderen Wert abgesehen von created_at. Dies ist das korrekte Verhalten gemäß Ruby Doc. Ich brauche die alle duplizierten Elemente im Formular nach ihrem created_at-Wert sortiert werden –

+0

Wenn Sie an einer Stelle eine Logik haben, wo Sie die 'dup' Methode aufrufen, denke ich, dass Sie auch das Attribut' created_at' im duplizierten Objekt aktualisieren können zur aktuellen Zeit. Wenn Sie nur eine Sortierung innerhalb eines Formulars behalten möchten, empfehle ich, ein brandneues Attribut zu verwenden, wie "Position", um den Bestellvorgang innerhalb des Formulars und den Bestellvorgang nach Datum zu entkoppeln. –