class << ruby 中的自我及其方法

class << self in ruby and its methods

我在 rails 上的 ruby 中有一个模型,代码如下,它使用单例 class 定义。此外,som 元编程逻辑。但是,当下面指定的属性正在编辑时,我不明白这段代码什么时候会 invoke.Is 它?

class Product < ApplicationRecord

    class << self
      ['cat_no', 'effort', 'impact', 'effect', 'feedback'].each do |attr| 
        define_method "update_#{attr}" do |pr, count, user_id|
           pr.order=pr.cat_no     
           pr.idea=pr.description
           pr.update("#{attr}"=>count,:last_modified_by=>user_id)
        end
      end
    end
end

请帮忙。 谢谢

此代码生成五个方法,每个方法对应列表中的每个属性名称。所有这些生成的方法都采用三个参数,基本上看起来像这样(我使用 impact 属性名称作为示例):

def self.update_impact(pr, count, user_id)
  pr.order = pr.cat_no     
  pr.idea = pr.description
  pr.update("impact" => count, :last_modified_by => user_id)
end

这意味着生成了五个方法,这些方法使用来自自身的一些数据以及 countuser_id.

更新传入的 pr

请注意,此方法仅处理特定的 pr,因此使用实例当然比使用 class 方法更好,正如 Stefan 在他的评论中已经建议的那样。而且 IMO 在这里元编程并没有真正的好处。我会将逻辑更改为

def update_count(type, count, user_id) # or any another name that makes sense in the domain
  if type.in?(%i[cat_no effort impact effect feedback])
    update(
      :order => cat_no, 
      :idea => description, 
      :last_modified_by => user_id, 
      type => count
    )
  else
    raise ArgumentError, "unsupported type '#type'"
  end
end

并调用它而不是

Model.update_impact(pr, count, user_id)

像这样

pr.update_count(:impact, count, user_id)