2

再利用される共通のメソッドを作成して、Railsコードをドライアップしたいと思います。そのためには、コード変数で使用されるいくつかのフィールド/属性とクラス名を作成する必要があります。これにより、同じコードで3つのモデル(およびそれらのフィールド)で機能できるようになります。この質問とこれから学ぼうとしました、うまくいきませんでした。

私のモデルでは、これがあります:

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 に答える