我有一个哈希看起来像这样:
"properties": [
{
"accommodates": 14,
"adr": 1336.69,
"host_id": 23724674,
"property_id": 4576625,
"bathrooms": 4.5,
"bedrooms": 5,
"business_ready": false,
"cancellation": "strict",
"check_in": "Anytime after 4PM",
"check_out": "11AM",
"cleaning_fee": 200,
"days_a_ltm": 138,
"days_b_ltm": 24,
"days_r_ltm": 203,
"extra_person_charge": 50,
"img_count": 26,
"img_cover": "",
"instant_book": true,
"last_calendar_update": "2018-02-16",
"latitude": 39.7610167973274,
"listed_dt": "2014-10-24",
"listing_url": "rooms/4576625",
"location": {
"city": "Denver",
"country": "United States",
"msa": "Denver-Aurora-Lakewood, CO Metro Area",
"neighborhood": [
"Highland"
],
"state": "Colorado",
"zipcode": "80211"
},
"longitude": -105.008507384098,
"minimum_stay": 2,
"num_res_ltm": 64,
"occ": 0.595308,
"price_monthly": 17000,
"price_nightly": 725,
"price_weekly": 5600,
"property_type": "Entire house",
"rating_overall": 9.9,
"response_rate": 100,
"response_time": 229,
"revenue": 271348,
"reviews": 124,
"room_type": "Entire home/apt",
"scraped_dt": "2018-02-25",
"security_deposit": 1000,
"superhost": true,
"title": "Huge Home in the Heart of Lohi! Groups Welcome!"
},
{
"accommodates": 15,
"adr": 781.576,
"host_id": 14178014,
"property_id": 9944575,
"bathrooms": 5,
"bedrooms": 6,
"business_ready": true,
"cancellation": "strict",
"check_in": "Anytime after 3PM",
"check_out": "12PM (noon)",
"cleaning_fee": 200,
"days_a_ltm": 46,
"days_b_ltm": 7,
"days_r_ltm": 312,
"extra_person_charge": 15,
"img_count": 49,
"img_cover": "",
"instant_book": true,
"last_calendar_update": "2018-02-15",
"latitude": 39.7349220878173,
"listed_dt": "2015-12-11",
"listing_url": "rooms/9944575",
"location": {
"city": "Denver",
"country": "United States",
"msa": "Denver-Aurora-Lakewood, CO Metro Area",
"neighborhood": [
"Capitol Hill"
],
"state": "Colorado",
"zipcode": "80218"
}
]
有一些关键的属性里面阵列哈希,我想改变,我想用一些简单的像transform_keys或deep_transform_keys;然而,这些方法取代,即要求一个下方,以改变两个或3.特别创建的所有键新地图中的所有钥匙,我期待重新命名ADR,收入和OCC。有谁知道如果只在某些键执行transform_key或deep_transform_key法的方式进行?就像是:
hash_name.deep_transform_keys{|k| {:adr=>'adr_ltm', :revenue => 'revenue_ltm'}[k] if k == 'adr'||'revenue'}
你可以monkey patch私有方法的类散,或重新实现自己的一个,这是观念
class Hash
private
def _deep_transform_keys_in_object(object, &block)
case object
when Hash
object.each_with_object({}) do |(key, value), result|
# define what key you want to run
return unless key != :key_name
result[yield(key)] = _deep_transform_keys_in_object(value, &block)
end
when Array
object.map {|e| _deep_transform_keys_in_object(e, &block) }
else
object
end
end
end
这种方法被用来以这种方式deep_transform_keys:
def deep_transform_keys(&block)
_deep_transform_keys_in_object(self, &block)
end
这是基本的想法,而不是全功能的代码,你需要确保它自己的工作。
是否有一个具体的原因,你不能仅仅通过循环?
hash[:properties].each_with_index do |property, i|
hash[:properties][i][:adr_ltm] = property.delete(:adr)
hash[:properties][i][:revenue_ltm] = property.delete(:revenue)
end
有序列化/反序列化的宝石,可帮助您在这些情况下。它们允许从模型都呈现JSON和JSON解析更新您的Ruby对象。其洙多灵活的长期维护的代码。
# deserialize
song = Song.new
SongRepresenter.new(song).from_json('{"id":1, "title":"Fallout"}')
song.id #=> 1
song.title #=> "Fallout"
# serialize
SongRepresenter.new(song).to_json #=> {"id":1, title":"Fallout"}