[英]Rails - How to define setter/getter dynamically for list of methods inside a class
[英]Define class methods dynamically in Rails
我在 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]
预定义这些学校?
我不完全清楚你想要实现什么。 如果要调用一个方法,自然要先定义它(只要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)
在对象/类上调用该方法。 但是请注意,如果您在接收方法缺失调用的同一个类上执行此操作并且未定义该方法,则会导致堆栈溢出。
我建议退回超级除非你有比赛
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.