我有一個帶有以下代碼的 ruby?? on rails 模型,它使用了單類定義。此外,還有一些元編程邏輯。但是,我不明白這段代碼什么時候會呼叫。是在下面指定的屬性正在編輯時嗎?
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
請幫忙。謝謝
uj5u.com熱心網友回復:
此代碼生成五種方法,一種用于串列中的每個屬性名稱。所有這些生成的方法都采用三個引數,基本上如下所示(我以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
這意味著生成了五個方法,它們pr使用來自自身的一些資料以及 acount和 a更新傳入的資料user_id。
請注意,此方法僅處理特定的,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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/380419.html
