我想检查表列中是否已存在字符串。 列名称采用字符串形式,@ language ='german',列名为德语。
Word.where(@language: string).empty?
所以我想要它做
Word.where(german: string).empty?
如何在where子句中使用@language?
答案 0 :(得分:2)
您可以使用exists?
:
Word.exists?(@language => string)
您遇到的问题是语法@language: string
实际上意味着:@language => string
。
不要认为这会变慢:
require 'benchmark'
@language = 'english'
string = 'Hello world'
Benchmark.bm do |x|
x.report { 100000.times { a = Hash[@language, string] } }
x.report { 100000.times { a = { @language => string } } }
end
打印出来
user system total real
0.100000 0.040000 0.140000 ( 0.143954)
0.050000 0.000000 0.050000 ( 0.050434)
在我的机器上。
有趣的是,在我的机器上它看起来像.where()。存在?比.exists更快?独自:
require 'benchmark'
column = 'last_name'
value = 'Jones'
Benchmark.bm do |x|
x.report { 10000.times { User.exists?(column => value) } }
x.report { 10000.times { User.where(column => value).exists? } }
end
答案 1 :(得分:2)
Word.where(Hash[@language, string]).exists?
Hash[@language, string]
是动态创建哈希的美丽红宝石之一。
irb(main):005:0> @language = 'german'
=> "german"
irb(main):006:0> string = 'kummerspeck'
=> "kummerspeck"
irb(main):007:0> Hash[@language, string]
=> {"german"=>"kummerspeck"}
答案 2 :(得分:1)
可能会因db而异,动态列不推荐btw
Word.where("#{@langauge} IS NULL")
答案 3 :(得分:0)
您可以使用column_names
返回所有表格列字段名称
Word.column_names.include?(@language)