Rails - Динамическое определение методов экземпляра в модели - PullRequest
3 голосов
/ 26 августа 2010

Я не уверен, что этого вообще можно достичь, но здесь идет ...:)

Предположим, две модели, модель Page и модель Field.Page has_many :fields и модель Field имеют два атрибута: :name, :value

Я хочу достичь в модели Page динамического определения методов экземпляра для каждого Field#name, возвращающего Field#value.

Итак, если бы на моей странице было поле с именем "foobar", я бы динамически создал такой метод:

def foobar
  fields.find_by_name("foobar").value
end

Можно ли этого достичь?Если это так, пожалуйста, помогите?

Обращаясь к рубиновикам ...

1 Ответ

1 голос
/ 26 августа 2010

Вы можете переопределить 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
...