我在ruby on rails中有一个模型,下面的代码使用了一个singleton类定义。还有一些元编程逻辑。但是,我不知道这段代码什么时候会调用。是在下面指定的属性正在编辑时吗?
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
这意味着生成了五个方法,它们使用来自自身的一些数据以及count
和user_id
来更新传入的pr
。
请注意,此方法只处理特定的pr
,因此使用实例而不是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)