如何在ruby模块中使用method_missing创建动态方法

时间:2018-06-22 00:54:34

标签: ruby

我有一个模块,其中包含一些有助于查找数据库条目的方法,并且我正在尝试创建此示例方法的动态方法:

def find_by(db_attribute, value)
  rows = connection.execute <<-SQL
    SELECT #{columns.join ","} FROM #{table}
    WHERE #{db_attribute} = #{Record::Utility.sql_strings(value)};
  SQL
end

我想弄清楚如何获得呼叫object.find_by_*(*星号是通常在find_by参数中的db_attribute),例如:klass.find_by_name('bob')返回与find_by(:name, 'bob')相同。

1 个答案:

答案 0 :(得分:3)

一个非常简单的解决方案

def method_missing(method_name, *args, &block)
  if method_name.to_s =~ /^find_by_(.+)$/
    find_by($1.to_sym => args)  # find_by_name, the $1 is `name`
  else
    super(method_name, *args, &block)
  end
end