如何在Ruby中使用方法而不是键

时间:2014-05-20 20:31:39

标签: ruby-on-rails ruby api

我在Ruby中使用API​​。我构建了自己的模型,可以与HTTParty一起使用api并获取数据。以下是我正在做的事情的一个例子:

tweets = Twitter::Tweets.all
first_tweet = tweets.first

这不会返回任何错误,但在tweets内,我们现在有一个包含所有推文的列表。 (我们将其存储在NoSQL DB中,以解决性能和速率限制问题。)现在,我们想知道我们的第一条推文何时被创建:

first_tweet.created_at
# => undefined method `created' for #<Hash:0x007ff3491062d0>

那太糟糕了......好的。它是一个哈希,所以我们尝试:

first_tweet['created_at']
# => "2014-04-07T08:37:47+00:00"

真棒!但是,我会做很多事情。

关键问题:有没有办法使用方法代替键?

修改

我理解我可以使用OpenStruct或宝石。谢谢你让我知道。我想现在的问题是:是否有一种有效的(和干的)方法将其实现到模型中?

这是我们的模型可能会是什么样子:

# app/models/twitter/tweet.rb
module Twitter
  class Tweet < Twitter::Base
    class << self
      def all
        get '/v1/tweets.json'
      end
    end
  end
end

Twitter::Base为了简要说明我们的配置:

# app/models/twitter/base.rb
module Twitter
  class Base < ActiveRecord::Base
    include HTTParty

    base_uri 'api.twitter.com'
    format :json
    default_params api_password: ENV['TWITTER_PASSWORD']
  end
end

虽然,我可以这样做:

def all
  tweets = get('/v1/tweets.json')
  array = []

  tweets.each do |tweet|
    array << OpenStruct.new(tweet)
  end

  return array
end

但是每个方法编写一个openstruct会有很多工作要做。我想我会在接下来的几天里探索它并回答我自己的问题,如果没有人知道干旱和可扩展的方式来实现它。

提醒:实际上并没有处理twitter api,但用例保持不变。

2 个答案:

答案 0 :(得分:2)

你可以修补哈希...(或创建一个继承的类),以便检查任何无法识别的方法,看它是否是哈希的关键

class Hash
  alias_method :original_method_missing, :method_missing
  def method_missing(method, *args, &block)
    if self.has_key?(method.to_s)
      self[method.to_s]
    else
      original_method_missing(method, *args, &block)
    end
  end
end

如果它是'具有无差别访问权限的哈希',那么在rails中可能不需要“to_s”

答案 1 :(得分:1)

Hashies(https://github.com/intridea/hashie)在模拟对象行为方面非常出色。现在,您可能想要创建一个真正的Tweet对象...