我有这个字符串:'industry.in'我想将它转换为:industry.in. 当我这样做'industry.in'.to_sym时,结果是::"industry.in"。
任何人都知道如何使它成为::industry.in而不是?
我这样做是为了在 Mongoid 中对数组字段进行条件查询:
criteria = 'industry.in'.to_sym
Company.where(criteria => ['Information Technology'])
:"industry.in"实际上是以industry.in可复制/可粘贴的方式表示的符号。
如果您:industry.in直接输入,您将收到“无方法”错误,因为 Ruby 会将其解析为:
call #in method on :industry symbol
所以,'industry.in'.to_sym实际上是在做你需要的。
其实很简单。但首先你必须明白你想要做什么。
:industry.in
这:industry是一个符号,in是对该符号的方法调用。因此,将字符串分成两部分,将第一部分转换为符号并使用第二部分动态调用方法。
require 'mongoid'
s = 'industry.in'
parts = s.split('.') # => ["industry", "in"]
parts[0].to_sym.send(parts[1]) # => #<Origin::Key:0x007fa872ec0550 @name=:industry, @strategy=:__intersect__, @operator="$in", @expanded=nil, @block=nil>
# just the same as literal
:industry.in # => #<Origin::Key:0x007fa872ebf970 @name=:industry, @strategy=:__intersect__, @operator="$in", @expanded=nil, @block=nil>