【问题标题】:Convert string to XXX将字符串转换为 XXX
【发布时间】:2016-07-14 09:59:02
【问题描述】:

queel,我可以做到:

User.where{id.eq "2" | admin.eq true}

查询。我想知道我是否可以翻译 [原文如此] 一个字符串,这是一个类似的条件:

string = "id: 2"

string = "id.eq '2' | admin.eq true"

然后运行:

User.where{string}

User.where(string)

结果不是哈希。我该怎么做?

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

您需要的是hash 而不是string。可以这样使用,

hash = {id: 2}
User.where(hash)

如果你真的想使用string,你可以这样做,

string = "id = 2"
User.where(string)

如果要执行字符串,可以使用eval。那样的话就变成这样了,

string = "{id: 2}"
User.where(eval string)

【讨论】:

  • 是的,但关键是如何将字符串转换为条件? (开玩笑的名字)。你知道User.where(id: 2) 是正确的语法,如果字符串是"id: 2",我们无法更改它,那么如何让User.where(string) 运行。有没有这样的方法:User.where(string.to_xxx) OR User.where(xxx(string))
【解决方案2】:

注意要使用下面的变体,应该阅读关于“ruby eval is evil”查询的谷歌输出的前五页。

User.where(instance_eval("{#{string}}"))

【讨论】:

  • @SergioTulentsev JSON.parse 需要有效的 JSON,不是吗?:JSON.parse "{id: 2}" #⇒ JSON::ParserError: 784: unexpected token at '{id: 2}'
  • 我因为 instance_eval 而投了反对票;我认为你的警告太弱了。这个答案确实需要一个明确的声明,例如“不要这样做!它会破坏你的应用程序的安全性”
  • @WayneConrad 您可能会随心所欲地想什么,也可以对包含完全有效、有用的语言约束的每个答案投反对票,这些约束是由 Matz 引入的,目的是使 ruby​​ 尽可能强大。我从来不属于 Eval Haters 教派。在某些情况下,它很棒。
  • 经过进一步思考,我希望我没有投反对票。我仍然认为,如果发出更强烈的警告,答案会更好,但否决票过于严厉,我深表歉意。
  • @WayneConrad 绝对没有什么可道歉的; SO 是由人类为人类制造的,幸运的是我们所有人都有不同的意见(否则生活会太无聊。)重要的是答案仍然存在,并且它(目前)得分@ 987654324@,这反过来意味着:a)所描述的实现方式存在,并且b)社区主要不理解它。我个人很欣赏任何意见分享,无论是积极的还是消极的。谢谢你不冷漠。
猜你喜欢
  • 2019-03-06
  • 2019-10-10
  • 2019-01-05
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多