1

私はRubyクラスを持っており、その各メソッドは特定の条件に基づいてハッシュの配列のインデックスを保持しています.

例(コードは最初の投稿以降に編集されています

module Dronestream
  class Strike

    class << self

    ...
    def strike
      @strike ||= all
    end

    def all
      response['strike'] # returns an array of hashes, each individual strike
    end

    def in_country(country)
      strike.keep_if { |strike| strike['country'] == country }
      self
    end

    def in_town(town)
      strike.keep_if { |strike| strike['town'] == town }
      self
    end
    ...
  end
end  

Dronestream::Strike.in_country('Yemen')このようにして、 、またはを行うことができDronestream::Strike.in_town('Taizz')、それぞれが配列を返します。でもできればDronestream::Strike.in_country('Yemen').in_town('Taizz')、イエメンのあの町のストライキだけ返してもらいたいです。

しかし今のところ、それぞれの個別のメソッドは配列を返します。私が彼らに return を返せばself、彼らは私が必要とするメソッドを持っていることを知っています. しかし、それらは配列を返さず、配列を呼び出すことができるように、たとえば呼び出すことも、それらを呼び出すこともできませfirsteach。を作成しようとしましStrike < Arrayたが、firstは のインスタンス メソッドでArrayあり、クラス メソッドではありません。

私は何をすべきか?

編集

これが私のテストスイートの一部です。以下の回答に従って、テストは個別に合格しますが、その後失敗します。

describe Dronestream::Strike do

  let(:strike) { Dronestream::Strike }

  before :each do
    VCR.insert_cassette 'strike', :record => :new_episodes
    @strike = nil
  end

  after do
    VCR.eject_cassette
  end
  ...
  # passes when run by itself and when the whole file runs together
  describe '#country' do
    let(:country_name) { 'Yemen' }
    it 'takes a country and returns strikes from that country' do
      expect(strike.in_country(country_name).first['country']).to eq(country_name)
    end
  end

  # passes when run by itself, but fails when the whole file runs together
  describe '#in_town' do
    let(:town_name) { 'Wadi Abida' }
    it 'returns an array of strikes for a given town' do
      expect(strike.in_town(town_name).first['town'].include?(town_name)).to be_true 
    end
  end
  ...
end
4

1 に答える 1

1

これを処理するために を上書きできますmethod_missing。orメソッドで
返しselfます。次に、呼び出されたときに、それを配列に渡して処理します。 コードは次のようになります。in_countryin_townfirstall

module Dronestream
  class Strike

  class << self

  ...
  def all
    ...
  end

  def in_country(country)
    all.keep_if { |strike| strike['country'] == country }
    self
  end

  def in_town(town)
    all.keep_if { |strike| strike['town'] == town }
    self
  end
  ...

  def method_missing(name,*args,&block)
    return all.send(name.to_sym, *args, &block) if all.respond_to? name.to_sym
    super
  end
end
于 2013-06-06T06:15:53.427 に答える