我有以下代码并尝试了一整天将类方法重构为sperate模块以与我的所有模型类共享功能。
class Merchant
include DataMapper::Resource
property :id, Serial
[...]
class << self
@allowed_properties = [:id,:vendor_id, :identifier]
alias_method :old_get, :get
def get *args
[...]
end
def first_or_create_or_update attr_hash
[...]
end
end
end
我想存档类似的内容:
class Merchant
include DataMapper::Resource
include MyClassFunctions
[...]
end
module MyClassFunctions
def get [...]
def first_or_create_or_update[...]
end
=> Merchant.allowed_properties = [:id]
=> Merchant.get( :id=> 1 )
但不幸的是,我的红宝石技能很糟糕。我读了很多东西(例如here),现在我更加困惑了。我偶然发现了以下两点:
alias_method
将失败,因为它将在DataMapper::Resource
模块中动态定义。allowed_properties
?什么是红宝石的方式?
非常感谢提前。
答案 0 :(得分:0)
Here是关于ruby类方法模块继承的一个很好的讨论。 这样的事情可以奏效:
module MyFunctions
module ClassMethods
@allowed_properties = [:id,:vendor_id, :identifier]
def get *args
opts = super_cool_awesome_sauce
super opts
end
def first_or_create_or_update[...]
end
end
def self.included(base)
base.extend(ClassMethods)
end
end
class Merchant
include DataMapper::Resource
include MyFunctions
[...]
end
因为它使用的是一种继承形式,所以您可以利用super
而不是alias_method
来使用ModuleName::ClassMethods
,而许多人认为这更为直接。
使用super
是您在Rails代码库中看到的很多内容,可以更轻松地使用{{1}}。