繁体   English   中英

在 Rails 中动态定义类方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM