我在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]
?
答案 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