从变量查询重复列

时间:2015-05-19 17:31:21

标签: ruby-on-rails ruby ruby-on-rails-4

我想检查表列中是否已存在字符串。 列名称采用字符串形式,@ language ='german',列名为德语。

Word.where(@language: string).empty?

所以我想要它做

Word.where(german: string).empty?

如何在where子句中使用@language?

4 个答案:

答案 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)