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而不必预先定义这些学校%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 回答
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
于 2020-05-03T11:55:37.077 回答