【问题标题】:How to call a method with its key names as string variable (determine dynamically key arguments)?如何使用其键名作为字符串变量调用方法(动态确定键参数)?
【发布时间】:2013-01-08 15:15:38
【问题描述】:

这是一个 Ruby 问题,尽管我在 Rails 上下文中使用它。

我需要调用一个方法,在该方法中我使用字符串变量为其键(参数名称)赋值。

例如我得到了:

MyRailsModelClass.where(key_of_my_method: my_value)

我想让它更有活力。 我可以像“my_rails_model_class”这样创建一个 MyRailsModelClass。分类

我需要让 key_of_my_method 更具动态性并用变量替换它。 我正在考虑类似的事情:

"my_rails_model_class".classify.where(my_key.to_sym => my_value)

有人知道吗? 谢谢

【问题讨论】:

  • 当然,这行得通。您在执行此操作时遇到问题吗?
  • Yes 似乎不适用于 rbuy 1.9 版密钥语法(没有“=>”)
  • 正确,您不能使用 JSON 类型的语法,因为符号只是动态引用的(通过 to_sym)。你有什么理由不能使用火箭语法=>?
  • 由于没有冒号的语法在 ruby​​ 1.9 中是新的,我预计将来可能会弃用“箭头”语法。
  • 不,目前还没有这样的想法 - 引入冒号语法是为了为常见情况启用更简单、更友好的代码。它不会取代火箭语法,因为它没有涵盖所有情况;而仅当键是静态符号时。对于动态分配符号或任何其他类型(Fixnum、String、younameit)的键,火箭语法是唯一有效的。

标签: methods ruby-on-rails-3.2 metaprogramming


【解决方案1】:

实际上,分类方法是不够的。您需要在应用任何类方法之前进行常量化。

我以这种方式解决了它(因为它更有效;而分类确实调用了更多方法:camelize(singularize(table_name.to_s.sub())):

"my_rails_model_class".camelize.constantize.where("my_key".to_sym == my_value).first

但你可以做得更长:

"my_rails_model_class".classify.constantize.where("my_key".to_sym == my_value).first

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2015-10-24
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多