3

これが達成できるかどうかはわかりませんが、ここに行きます... :)

Pageモデルとモデルの 2 つのモデルを想定してみましょうField。APage has_many :fieldsであり、Fieldモデルには次の 2 つの属性があります。:name, :value

私が達成したいのは、モデル内で、 を返すPageそれぞれのインスタンス メソッドを動的に定義することです。Field#nameField#value

したがって、ページに「foobar」という名前のフィールドがある場合、次のようなメソッドを動的に作成します。

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

これは達成できますか?もしそうなら、助けてください?

ルビー主義者に...

4

1 に答える 1

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
于 2010-08-25T21:54:03.443 に答える