2015-07-22 53 views
0

我有一個類,我正在使用通過方法鏈構建複雜對象。我是新來的紅寶石,所以我必須在這裏丟失一些明顯的東西。我期望返回一個哈希看起來像這樣:{"must"=>[{:match=>{"status_type" : "good"}}, {:match=>{"product_age" : "old"}}]}實例變量似乎沒有在ruby方法鏈接中填充

但我得到的是這樣的:{"must"=>[{:match=>{}}]}

我援引上述嘗試下面的代碼:

builder = QueryBuilder.new 
built = builder.must("status_type").equals("good").must("product_age").equals("old") 
built.serialize_this 

這裏是我的課。我很感激任何幫助,因爲我對Ruby很新。

class QueryBuilder 
    attr_accessor :query_hash, :context, :condition_hash 

    def initialize 
     @query_hash = {} 
     @condition_hash = {} 
    end 

    def serialize_this 
     return @query_hash 
    end 

    def must(search_field) 
     @context = "must" 
     @condition_hash[search_field] = "temp" 
     return self 
    end 

    def should(search_field) 
     @context = "should" 
     @condition_hash[search_field] = "temp" 
     return self 
    end 

    def equals(value_field) 
     search_field = @condition_hash.keys[0].to_s 
     @condition_hash[search_field] = value_field 
     match_hash = {} 
     match_hash[:match] = @condition_hash 
     an_array =[] 
     an_array << match_hash 
     @query_hash[@context] = an_array 
     @condition_hash.clear 
    return self 
    end 
end 

非常感謝您爲我的代碼提供的任何燈光。

+0

在方法的末尾沒有明確地返回某些東西,這更具有地道性。例如,在'equals'方法的最後一行,只需寫'self'而不是'return self'。 – yihangho

+0

這應該不會有所作爲。 –

+0

它不應該。我只是說它比較習慣,不會解決問題。 – yihangho

回答

1

當你這樣做:

match_hash [:匹配] = @condition_hash

你不把哈希值的副本存在,你把一個參考的哈希值。這是你後來清楚的一樣的散列。

Is Ruby pass by reference or by value?

+0

太棒了!那確實解決了空的散列問題,但是它錯過了status_type =>好。它只顯示第二個散列,即:'{「must」=> [{:match => {「product_age」=>「old」}}]}' –

+0

當然,每次實例化一個新數組,對它的價值。舊陣列丟失。 – wired9

+0

明白了。我看到我們必須這樣做:'(@query_hash [@context] || = [])<< match_hash ' –