如何按属性对对象进行排序?

5
我一段时间以来一直面临这个问题,请查看一下。object.inspect 给我输出如下:
<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>

调用 object.to_yaml 方法会输出以下内容:

-- !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

我想按照创建时间的值进行排序,这个值可以在执行raise object.to_yaml时得到。如何实现?


使用 RawMaterial.order(:created_at),但只有在对象被持久化到数据库后才能使用它(在您的yaml输出中显示new_record:true,这意味着它尚未持久化,这就是为什么created_at目前为空的原因)。 - Kkulikovskis
我想使用当我调用 object.to_yaml 时获取的值,其中有一个不为空的 created_at 值,我能使用它吗? - Dev R
你不想将对象保存到数据库中的原因是什么?另一种方法是在你的模型中创建一个自定义的 initialize 方法,并使用值 Time.now 分配一个属性,如果你对实际对象初始化的时间感兴趣的话。使用你想要的属性似乎非常不专业。 - Kkulikovskis
@Kkulikovskis 我正在复制object1对象(进行深度克隆),这将进入控制器的新操作,因此新视图中的字段将填充我们正在复制的object1值,但它们的顺序不是object1的顺序,因此我们想要根据object1的created_at属性对其进行排序。 - Dev R
哦,好的,那我想我无法帮忙了,因为我还不熟悉深层复制。 :) - Kkulikovskis
1个回答

2

如果我理解正确,您有一个类型为RawMaterial的对象列表。您可以使用对象字段['attributes']['attributes']['values']['created_at']对列表进行排序,该字段对于每个对象都是唯一的,可以使用Enumerable.sort_by方法。

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

嗨,我的问题是.dup方法不会复制created_at值。我得到了除created_at之外的所有其他值。这是根据Ruby文档的正确行为。我需要以它们的created_at值排序的形式获得所有重复的元素。 - Dev R
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Antonio Bardazzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接