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



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

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')相同的内容。

一个非常简单的解决方案

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

最新更新