我不确定这是否可以实现,但是这里...:)
让我们假设两个模型,一个Page
模型和一个Field
模型。 Page has_many :fields
和 Field
模型有两个属性::name, :value
我想要实现的是在 Page
模型中为每个返回 Field#value
的 Field#name
动态定义实例方法。
因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个方法,如下所示:
def foobar
fields.find_by_name("foobar").value
end
这能实现吗?如果是这样,请帮助?
交给 rubyists...
最佳答案
您可以覆盖 method_missing 以实现您的目标:
def method_missing(method, *args, &block)
super
rescue NoMethodError => e
field = fields.find_by_name(method)
raise e unless field
field.value
end
可能最好为您的动态方法添加前缀或后缀,例如:
def method_missing(method, *args, &block)
if method.starts_with?('value_of_')
name = method.sub('value_of_', '')
field = fields.find_by_name(method)
field && field.value
else
super
end
end
然后这样调用它:
page.value_of_foobar
关于ruby-on-rails - Rails - 在模型中动态定义实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3570457/