2015-04-25 170 views
0

我試圖在一個易於閱讀的格式化代碼中列出一堆列。我知道我可能只是這樣做:Rails更新基於數組的多列

@user = User.find(3) 
@user.column1 = nil 
@user.column2 = nil 
@user.column3 = nil 
etc... 

但是這似乎並不像一個很紅寶石的方式做的事情,也不是特別乾淨閱讀。

我試圖弄清楚爲什麼我不能只是做一個「每個做」數組是這樣的:

columns = [ "key", "provider", "uid", "access_code", 
       "customer_id", "cc_id", "cc_brand", "cc_last4", 
       "cc_expiration", "last_payment_id", "last_payment_date", 
       "last_payment_amount" ] 

columns.each do |record| 
    @user.record = nil 
end 

@user.save 

我收到以下錯誤:

undefined method `record=' for #<User:0x00000003a91d18> 

我知道類似的問題之前已經被問過,但他們通常與更新一堆不同的表格有關。我只對用戶表感興趣。

此外,還有很多答案鏈接到http://apidock.com/rails/ActiveRecord/Base/update_all/class。但是,這是一箇舊的棄用方法,顯然繞過回調。這似乎相當危險。

任何人都可以想到爲什麼一個簡單的'每做'數組將無法正常工作?

回答

1

您可以使用動態函數的名稱發送funtion:

@user.send("#{record}=", nil) 
+0

哇!快速有效的答案。這工作完美。謝謝!! – BoomShadow

+1

當然,爲了解決這樣的問題,提出了「發送」函數,你試圖做的是爲@user調用名爲record的記錄函數,而不是調用你想要的函數名稱,這就是爲什麼它沒有爲這個對象引發任何稱爲記錄的函數,如果你想獲得屬性的值,你也可以調用@ user.send(record) –

1

send也可以用來打電話與您的模型相關的(私有方法太)的方法。

然而,因爲在你的情況,你只能編輯ActiveRecord的對象的字段(而不是調用任何方法),這裏是一種替代方法:

columns = [ "key", "provider", "uid", "access_code", 
      "customer_id", "cc_id", "cc_brand", "cc_last4", 
      "cc_expiration", "last_payment_id", "last_payment_date", 
      "last_payment_amount" ] 

columns.each do |record| 
    @user[record] = nil 
end 

@user.save 
+0

這是一個很好的替代解決方案。閱讀更清潔。我喜歡。 – BoomShadow

1

而不訴諸瑞士軍刀另一種選擇刀的send

columns = [ "key", "provider", "uid", "access_code", 
      "customer_id", "cc_id", "cc_brand", "cc_last4", 
      "cc_expiration", "last_payment_id", "last_payment_date", 
      "last_payment_amount" ] 

params = columns.map(&:to_sym).zip([nil]).to_h 

@user.update_attributes(params) 
+2

你可以在這裏利用'zip'替代'inject'。 'columns.zip([nil])。to_h' – spike

+0

不錯的@spike。編輯答案反映了這一點。 – fylooi