我有一个模块,其中包含一些有助于查找数据库条目的方法,并且我正在尝试创建此示例方法的动态方法:
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')
相同。
答案 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