2011-11-02 51 views
0
list = [] 
    Merchant.all.each do |merchant| 
     if merchant.url.present? && merchant.url != merchant.api_data.url 
     list.push({ 
      :id => merchant.id, 
      :name => merchant.name, 
      :another => merchant.another, 
      :another => merchant.another, 
      :another => merchant.another 
     }) 
     end 
    end 

是否有更簡單的方法來創建該對象的某些字段的散列?對不起,如果這太明顯了。我正在從PHP過渡到Ruby。有沒有更簡單的方法來創建模型數據的散列? (Ruby初學者)

回答

4
merchants = Merchant.all.map do |merchant| 
    if merchant.url.present? && merchant.url != merchant.api_data.url 
    merchant.attributes.slice("id", "name", "another") 
    end 
end.compact 

注:

  • 爲什麼你需要從商家實例屬性中提取,而不是使用記錄本身的?
  • 請勿使用通用名稱作爲list。爲變量賦予有意義的名稱。
  • 考慮將某些邏輯移至SQL級別。就是這樣,創建範圍可以過濾所需的記錄,速度會更快。

使用記錄:

merchants = Merchant.all.select do |merchant| 
    merchant.url.present? && merchant.url != merchant.api_data.url 
end 
+0

哇,謝謝!我需要提取幾個字段以將該數據作爲電子郵件發送。 – Hopstream

+0

不需要爲此構建散列,只需傳遞商人對象並在適當時訪問屬性即可。 – tokland

+0

所以像這樣?...'list = [] Merchant.all.each do | merchant | 如果merchant.url.present? && merchant.url!= merchant.api_data.url list.push(merchant) end end' – Hopstream

0

你可以#reject#select所有不需要/需要從merchant.attributes屬性,所以他們或不獲取添加到列表中。可能看看reject method。儘管按照您已經做過的方式添加屬性並不罕見。

問候

托比亞斯

相關問題