在Rails中动态定义类方法

时间:2013-06-24 18:16:00

标签: ruby-on-rails ruby-on-rails-3 method-missing

我在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中预先定义这些学校时,如何使用缺少方法来调用%w[school1 school2]

2 个答案:

答案 0 :(得分: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)在对象/类上调用该方法。但要注意,如果你在接收方法缺失调用的同一个类上执行此操作并且未定义方法,则会出现堆栈溢出。

答案 1 :(得分:0)

除非有比赛,否则我建议退回超级


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