Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ruby模块中缺少的方法创建动态方法_Ruby - Fatal编程技术网

如何使用ruby模块中缺少的方法创建动态方法

如何使用ruby模块中缺少的方法创建动态方法,ruby,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 def find

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

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
def find_by(db_属性,值)
rows=connection.execute一个非常简单的解决方案

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
一个非常简单的解决方案

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

哇,这就是我所需要的?当我在谷歌上搜索答案时,我遇到了太多的指南,把我弄糊涂了。许多文章都说,这是一个好主意,也更新回应?当您重新定义method_missing时,我看到其他人也在使用alias和alias_方法。我不确定我需要做什么,感谢技术上这应该是
find_by($1,*args)
,以匹配方法签名,并避免args
Array
成为查询中的字符串值。此外,对super的调用不需要传递显式参数(但这更像是一个诡辩)@WolfgangTruong:是的,无论何时实现
method\u missing
,都应该相应地实现
respond\u to\u missing?
respond\u to
将要求
respond\u to\u missing?
,因此即使对于动态处理的不存在的方法的消息,也会正确地响应
true
。@Wolfgangtrung:这些指南看起来比这更复杂的原因之一是,这个答案不会动态创建方法。它只动态处理消息,这要简单得多。如果您搜索指南来动态创建方法,那么它们当然要复杂得多。我不知道你为什么问动态创建方法,然后接受一个不这样做的答案。显然,解决您的问题并不需要动态创建方法。@JörgWMittag我的意思是它确实创建了动态方法。。。因为现在我可以调用任何find_by_*方法,它将使用find_by方法来查找记录。它不仅处理消息,还将任何方法
find\u by
调用重定向到
find\u by()
方法。我想你可能会说我的问题可能会有不同的标题,我很高兴它被解决了:哇,这就是我所需要的吗?当我在谷歌上搜索答案时,我遇到了太多的指南,把我弄糊涂了。许多文章都说,这是一个好主意,也更新回应?当您重新定义method_missing时,我看到其他人也在使用alias和alias_方法。我不确定我需要做什么,感谢技术上这应该是
find_by($1,*args)
,以匹配方法签名,并避免args
Array
成为查询中的字符串值。此外,对super的调用不需要传递显式参数(但这更像是一个诡辩)@WolfgangTruong:是的,无论何时实现
method\u missing
,都应该相应地实现
respond\u to\u missing?
respond\u to
将要求
respond\u to\u missing?
,因此即使对于动态处理的不存在的方法的消息,也会正确地响应
true
。@Wolfgangtrung:这些指南看起来比这更复杂的原因之一是,这个答案不会动态创建方法。它只动态处理消息,这要简单得多。如果您搜索指南来动态创建方法,那么它们当然要复杂得多。我不知道你为什么问动态创建方法,然后接受一个不这样做的答案。显然,解决您的问题并不需要动态创建方法。@JörgWMittag我的意思是它确实创建了动态方法。。。因为现在我可以调用任何find_by_*方法,它将使用find_by方法来查找记录。它不仅处理消息,还将任何方法
find\u by
调用重定向到
find\u by()
方法。我想你可能会说我的问题可能会有不同的标题,我很高兴它被解决了:D。