0

Ruby on Railsアプリケーションにこのクラスがあります

class ChartData
  def self.user_logs_by_day(logs)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        days_with_hours[log.user.name][log.log_date] = log.total_hours
      end
    days_with_hours
  end

  def self.project_logs_by_day(logs)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        if !log.project.nil?
          days_with_hours[log.project.name][log.log_date] = log.total_hours
        else
          days_with_hours[@default][log.log_date] = log.total_hours
        end
      end
    days_with_hours
  end
end

この方法を多くのモデルで使いたいので、このように 2 つの方法を 1 つにまとめたいと思います。

class ChartData
  def self.logs_by_day(logs, klass)
    days_with_hours = Hash.new{|h, k| h[k] = Hash.new(&h.default_proc)}
      logs.each do |log|
        if !log.klass.nil?
          days_with_hours[log.klass.name][log.log_date] = log.total_hours
        else
          days_with_hours[@default][log.log_date] = log.total_hours
        end
      end
    days_with_hours
  end
end

このようにクラスやモデルをメソッドに渡したい

ChartData.logs_by_day(logs, Project)

モデル内のパラメーター Project を処理して、ログのインスタンス メソッドになるようにするにはどうすればよいですか?

かなり不器用な試み

1.9.3p125 :026 > Project.name.downcase
 => "project" 

もっと良いですか?他のリファクタリングの提案は大歓迎です

4

2 に答える 2

2

なぜクラスに合格したいのですか?どこにも使っていません。シンボルを渡します。

ChartData.logs_by_day(logs, :project)

その後

def self.logs_by_day(logs, prop)
  # ...
  log.send(prop).name
  # ...
end
于 2012-12-04T21:57:34.803 に答える
0

Rails の場合、おそらく必要なのは のようなものですklass.name.underscore。これとそれに対応camelizeするものは、メソッド スタイルの命名規則とモジュール スタイルの命名規則の間で変換するように設計されています。特に、これは「UserData」のようなクラス名で機能します。これは、単に小文字化するだけで得られる「userdata」ではなく、「user_data」にする必要があります。その後、それをメソッド セレクタとして に渡すことができますsend

于 2012-12-04T22:51:55.887 に答える