2

我想通过创建一个可以重用的通用方法来干燥我的 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

有人可以帮我确定我做错了什么吗?

4

2 回答 2

2

如果要分配给属性,则需要带有等号的方法名称:

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

另外,这个:

rank_class = (klass.name).constantize

相当于:

rank_class = klass
于 2013-03-26T00:37:50.600 回答
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

顺便提一句

这是您原始问题的答案。

于 2013-03-26T03:23:24.020 回答