2013-03-26 67 views
2

我想通過製作一個可重用的常用方法來幹掉我的Rails代碼。爲此,我必須創建一些字段/屬性以及代碼變量中使用的類名稱,以便它可以爲三個模型(及其字段)使用相同的代碼。我試圖從這個questionthis one中學習,但我一直無法使它工作。在Rails中使用變量名稱作爲屬性

在我的模型,我有這樣的:

def self.update_percentages  
    update_percentages_2(User, "rank", "top_percent") 
end 

def self.update_percentages_2(klass, rank_field, percent_field) 
    rank_class = (klass.name).constantize 
    total_ranks = rank_class.maximum(rank_field) 
    top_5 = (total_ranks * 0.05).ceil 

    rank_class.find_each do |f| 
    if f.send("#{rank_field}") <= top_5 
     f.send("#{percent_field}", 5) 
     f.save 
    end 
    end 
end 

有了這個代碼,我得到ArgumentError: wrong number of arguments (1 for 0)。當我開始發表評論以縮小問題範圍時,看起來f.send("#{percent_field}", 5)會導致錯誤。

如果我補充一下: percent_field = (percent_field).constantize

我得到:Name Error: wrong constant name top_percent

有人可以幫我確定我做錯了什麼嗎?

回答

2

如果你想分配給一個屬性,你需要的方法名等號:

f.send("#{percent_field}=", 5) 

而且,這樣的:

rank_class = (klass.name).constantize 

是相同的:

rank_class = klass 
1

我會重寫您的方法來更新交易中的所有合格記錄。

def self.update_percentages_2(klass, rank_field, percent_field) 
    top_5 = (klass.maximum(rank_field) * 0.05).ceil 
    klass.where("#{rank_field} <= ?", top_5).update_all(percent_field => 5) 
end 

BTW

這裏是一個answer到你原來的問題。