有没有办法才用变换方法transform_keys Rails中的一些关键?

问题描述 投票:0回答:3

我有一个哈希看起来像这样:

 "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'}
ruby-on-rails hash ruby-on-rails-5
3个回答
0
投票

你可以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

这是基本的想法,而不是全功能的代码,你需要确保它自己的工作。


0
投票

是否有一个具体的原因,你不能仅仅通过循环?

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

0
投票

有序列化/反序列化的宝石,可帮助您在这些情况下。它们允许从模型都呈现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"}
© www.soinside.com 2019 - 2024. All rights reserved.