2

次のように、Rails で動的にクラス メソッドを定義します。

class << self
  %w[school1 school2].each do |school|
    define_method("self.find_by_#{school}_id") do |id|
        MyClass.find_by(school: school, id: id)
    end
  end
end

find_by_SOME_SCHOOL_idこれらの学校を で事前に定義しなくても、missing メソッドを使用して呼び出すにはどうすればよい%w[school1 school2]ですか?

4

2 に答える 2

3

あなたが達成したいことは私には完全には明らかではありません。メソッドを呼び出したい場合は、当然、最初に定義する必要があります (ActiveRecord がこれを処理しない限り)。次のようなことができます。

class MyClass
  class << self
    def method_missing(m, *args, &block)  
      match = m.to_s.match(/find_by_school([0-9]+)_id/)
      if match
        match.captures.first
      else
        nil
      end
    end  
  end
end

puts MyClass.find_by_school1_id
puts MyClass.find_by_school2_id
puts MyClass.find_by_school22_id
puts MyClass.find_by_school_id

これは出力されます:

1
2
22
nil

その後、メソッド名に含まれる ID を使用して何かを行うことができます。メソッドが定義されていることが確実な場合は、 を使用send(m, args)してオブジェクト/クラスでそのメソッドを呼び出すこともできます。ただし、メソッドの欠落呼び出しを受け取る同じクラスでこれを行い、メソッドが定義されていない場合は、スタック オーバーフローが発生することに注意してください。

于 2013-06-24T19:00:00.783 に答える