2017-04-24 42 views
3
更新模型值

我不能找到一種方法來合併這兩條線在我的Ruby代碼:Ruby代碼中JSON

def as_json(options={}) 
    super(options).merge ({ :id => self.id.upcase }) # upcase id 
    super(options).reject { |k, v| v.nil? } # reject nil values 
end 

如何管理mergesuperreject

編輯:什麼超級(選項)的示例返回:

{ 「ID」=> 「6ea8db7f-18a8-422d-9510-5b615883ed7c」, 「USER_ID」=> 1, 「CONTACT_ID」 =>零, 「producer_id」=>無}

問題是當contact_idproducer_idnil

super(options).reject { |_k, v| v.nil? }.merge(id: id.upcase, contact_id: contact_id.upcase, producer_id: producer_id.upcase) 

編輯2:這是工作,但它非常難看

super(options).merge(id: id.upcase, contact_id: contact_id ? contact_id.upcase : nil, producer_id: producer_id ? producer_id.upcase : nil).reject { |_k, v| v.nil? } 

回答

3

您可以鏈的方法很多,因爲你需要:

def as_json(options={}) 
    super(options).reject { |k, v| v.nil? }.merge ({ :id => self.id.upcase }) 
end 

這裏是你的代碼稍微更常規版本:

def as_json(options = {}) 
    super(options).reject { |_k, v| v.nil? }.merge(id: id.upcase) 
end 
  • 使用空間,同時參數
  • _k的設置默認值意味着k未在塊
  • 不需要{}merge
  • 無需用於self
+1

感謝安德烈!而你的第二個代碼很好,很好的解釋。奇蹟般有效。 –

+0

你爲什麼選擇'_k'而不是'_'?一般來說,我看到這寫成'reject {| _,v | ...} – engineersmnky

+0

@engineersmnky我認爲這是一個品味問題。在這個特殊的(簡單的)情況下,兩者對我來說同樣適用,但是當處理更復雜/更有意義的哈希值時,我用全名稱調用我的塊變量,而對於未使用的哈希,我使用'_variable',而不是'_',因爲它可以幫助我在將來更快地閱讀和記住代碼:) –