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
这意味着生成了五个方法,这些方法使用来自自身的一些数据以及 count
和 user_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)
我在 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
这意味着生成了五个方法,这些方法使用来自自身的一些数据以及 count
和 user_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)