Rails - 在模型中动态定义实例方法

时间:2010-08-25 21:41:37

标签: ruby-on-rails ruby model dynamic instance-methods

我不确定这是否可以实现,但这里......:)

让我们假设两个模型,Page模型和Field模型。 Page has_many :fieldsField模型有两个属性::name, :value

我想要实现的是Page模型,为每个返回Field#name的{​​{1}}动态定义实例方法。

因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个这样的方法:

Field#value

这可以实现吗?如果有,请帮忙吗?

对于红宝石......

1 个答案:

答案 0 :(得分:1)

您可以覆盖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