2015-12-01 27 views
1

我將我的應用升級到了Rails4。Rails4升級:active record.to_yaml已更改

我喜歡在控制檯中執行puts object.to_yaml來檢查我的對象。

在Rails 3,我會得到:

puts User.first.to_yaml 
--- !ruby/object:User 
    id: '1' 
    fname: Hello 
    lname: World 
    email: [email protected] 
    slug: hello-world 
    facebook_url: 
    twitter_url: 
    skype_pseudo: 
    website_url: 
    created_at: '2015-06-23 08:20:35.744329' 
    updated_at: '2015-08-18 14:54:25.669312' 
    encrypted_password: "$2a$10$FDZgUOmxZCN5dYYCsMO1HuOfe.QfRsFd8XCnGV0DsiIMIwKDR4zoS" 
    reset_password_token: 
    reset_password_sent_at: 
    remember_created_at: 
    sign_in_count: '1' 
    current_sign_in_at: '2015-08-18 14:54:25.667587' 
    last_sign_in_at: '2015-08-18 14:54:25.667587' 
    current_sign_in_ip: 127.0.0.1 
    last_sign_in_ip: 127.0.0.1 

而在軌道4,5,我得到的所有那些(沒用對我來說)數據:

puts User.first.to_yaml 
--- !ruby/object:User 
raw_attributes: 
    id: '1' 
    fname: Hello 
    lname: World 
    email: [email protected] 
    slug: hello-world 
    facebook_url: 
    twitter_url: 
    skype_pseudo: 
    website_url: 
    created_at: '2015-06-23 08:20:35.744329' 
    updated_at: '2015-08-18 14:54:25.669312' 
    encrypted_password: "$2a$10$FDZgUOmxZCN5dYYCsMO1HuOfe.QfRsFd8XCnGV0DsiIMIwKDR4zoS" 
    reset_password_token: 
    reset_password_sent_at: 
    remember_created_at: 
    sign_in_count: '1' 
    current_sign_in_at: '2015-08-18 14:54:25.667587' 
    last_sign_in_at: '2015-08-18 14:54:25.667587' 
    current_sign_in_ip: 127.0.0.1 
    last_sign_in_ip: 127.0.0.1 
attributes: !ruby/object:ActiveRecord::AttributeSet 
    attributes: !ruby/object:ActiveRecord::LazyAttributeHash 
    types: 
     id: &2 !ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer 
     precision: 
     scale: 
     limit: 
     range: !ruby/range 
      begin: -2147483648 
      end: 2147483648 
      excl: true 
     fname: &1 !ruby/object:ActiveRecord::Type::String 
     precision: 
     scale: 
     limit: 255 
     lname: *1 
     email: *1 
     slug: *1 
     home_space_id: *2 
     facebook_url: *1 
     twitter_url: *1 
     skype_pseudo: *1 
     website_url: *1 
     created_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: &3 !ruby/object:ActiveRecord::ConnectionAdapters::PostgreSQL::OID::DateTime 
      precision: 
      scale: 
      limit: 
     updated_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *3 
     encrypted_password: *1 
     reset_password_token: *1 
     reset_password_sent_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *3 
     remember_created_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *3 
     sign_in_count: *2 
     current_sign_in_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *3 
     last_sign_in_at: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
     subtype: *3 
     current_sign_in_ip: *1 
     last_sign_in_ip: *1 
    values: 
     id: '1' 
     fname: Hello 
     lname: World 
     email: [email protected] 
     slug: hello-world 
     facebook_url: 
     twitter_url: 
     skype_pseudo: 
     website_url: 
     created_at: '2015-06-23 08:20:35.744329' 
     updated_at: '2015-08-18 14:54:25.669312' 
     encrypted_password: "$2a$10$FDZgUOmxZCN5dYYCsMO1HuOfe.QfRsFd8XCnGV0DsiIMIwKDR4zoS" 
     reset_password_token: 
     reset_password_sent_at: 
     remember_created_at: 
     sign_in_count: '1' 
     current_sign_in_at: '2015-08-18 14:54:25.667587' 
     last_sign_in_at: '2015-08-18 14:54:25.667587' 
     current_sign_in_ip: 127.0.0.1 
     last_sign_in_ip: 127.0.0.1 
    additional_types: {} 
    materialized: true 
    delegate_hash: 
     id: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: id 
     value_before_type_cast: '1' 
     type: *2 
     fname: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: fname 
     value_before_type_cast: Hello 
     type: *1 
     lname: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: lname 
     value_before_type_cast: World 
     type: *1 
     email: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: email 
     value_before_type_cast: [email protected] 
     type: *1 
     slug: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: slug 
     value_before_type_cast: hello-world 
     type: *1 
     facebook_url: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: facebook_url 
     value_before_type_cast: 
     type: *1 
     twitter_url: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: twitter_url 
     value_before_type_cast: 
     type: *1 
     skype_pseudo: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: skype_pseudo 
     value_before_type_cast: 
     type: *1 
     website_url: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: website_url 
     value_before_type_cast: 
     type: *1 
     created_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: created_at 
     value_before_type_cast: '2015-06-23 08:20:35.744329' 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     updated_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: updated_at 
     value_before_type_cast: '2015-08-18 14:54:25.669312' 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     encrypted_password: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: encrypted_password 
     value_before_type_cast: "$2a$10$FDZgUOmxZCN5dYYCsMO1HuOfe.QfRsFd8XCnGV0DsiIMIwKDR4zoS" 
     type: *1 
     reset_password_token: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: reset_password_token 
     value_before_type_cast: 
     type: *1 
     reset_password_sent_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: reset_password_sent_at 
     value_before_type_cast: 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     remember_created_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: remember_created_at 
     value_before_type_cast: 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     sign_in_count: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: sign_in_count 
     value_before_type_cast: '1' 
     type: *2 
     current_sign_in_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: current_sign_in_at 
     value_before_type_cast: '2015-08-18 14:54:25.667587' 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     last_sign_in_at: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: last_sign_in_at 
     value_before_type_cast: '2015-08-18 14:54:25.667587' 
     type: !ruby/object:ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter 
      subtype: *3 
     current_sign_in_ip: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: current_sign_in_ip 
     value_before_type_cast: 127.0.0.1 
     type: *1 
     last_sign_in_ip: !ruby/object:ActiveRecord::Attribute::FromDatabase 
     name: last_sign_in_ip 
     value_before_type_cast: 127.0.0.1 
     type: *1 
new_record: false 
active_record_yaml_version: 0 

任何改變我回到以前的行爲或找到解決辦法?

回答

1

要改變的to_yaml輸出,可以覆蓋encode_with。我有同樣的問題與Rails的4.1不兼容升級到4.2,並修復它:

class ActiveRecord::Base 
    def encode_with(coder) 
    coder['attributes'] = attributes_before_type_cast 
    end 
end 

attributes是在YAML鍵和attributes_before_type_cast是值。要匹配問題中的請求(記錄的屬性立即在YAML的根目錄下),這應該工作:

class ActiveRecord::Base 
    def encode_with(coder) 
    attributes_before_type_cast.each{|k, v| coder[k] = v} 
    end 
end 
+0

聽起來很有趣。雖然我仍然很想知道爲什麼它首先被改變了。 –

1

這是否適合您?

User.first.attributes.to_yaml 
+0

是的,這可以工作。但是當它是一個我想檢查的數組時,它變得更加痛苦:'User.where(last_name:'Jobs')。map(&:attributes).to_yaml'。如果沒有其他的可能性,我會繼續這樣做。 –