Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从变量中查找重复项的查询列_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 从变量中查找重复项的查询列

Ruby on rails 从变量中查找重复项的查询列,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我想检查表列中是否已经存在字符串。列名采用字符串形式,@language='german',列名为德语 Word.where(@language: string).empty? 所以我想让它这样做 Word.where(german: string).empty? 我如何在where子句中使用@language?您可以使用exists?: Word.exists?(@language => string) 您遇到的问题是,语法@language:string实际上意味着:@langu

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

Word.where(@language: string).empty?
所以我想让它这样做

Word.where(german: string).empty?

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

您可以使用
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()存在?比…快。存在吗?就其本身而言:

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

您可以使用
存在?

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()存在?比…快。存在吗?就其本身而言:

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

可能因数据库而异,不建议使用动态列

Word.where("#{@langauge} IS NULL")

可能因数据库而异,不建议使用动态列

Word.where("#{@langauge} IS NULL")
Hash[@language,string]
是动态创建哈希的漂亮Ruby之一

irb(main):005:0> @language = 'german'
=> "german"
irb(main):006:0> string = 'kummerspeck'
=> "kummerspeck"
irb(main):007:0> Hash[@language, string]
=> {"german"=>"kummerspeck"}
Hash[@language,string]
是动态创建哈希的漂亮Ruby之一

irb(main):005:0> @language = 'german'
=> "german"
irb(main):006:0> string = 'kummerspeck'
=> "kummerspeck"
irb(main):007:0> Hash[@language, string]
=> {"german"=>"kummerspeck"}

您可以使用
column\u names
返回所有表列字段名


Word.column\u name.include?(@language)

您可以使用
column\u name
返回所有表列字段名



Word.column\u name.include?(@language)

没有列语言:,未知列“words.language”。。。该列是“words.derman”,但可以是基于字符串的“words.chinese”。啊,从您的描述中没有捕捉到这一点。更新。很好的解释,有意义。散列方式在我的日志中更快。速度快了很多,所以我将使用它。很好,谢谢你的基准测试。我试过了。令人惊讶的是
“#{@language}”=>string
的速度实际上快得可以忽略。希望这在误差范围内,因为这没有意义。没有列语言:,未知列“words.language”。。。该列是“words.derman”,但可以是基于字符串的“words.chinese”。啊,从您的描述中没有捕捉到这一点。更新。很好的解释,有意义。散列方式在我的日志中更快。速度快了很多,所以我将使用它。很好,谢谢你的基准测试。我试过了。令人惊讶的是
“#{@language}=>string
的速度实际上快得可以忽略不计。希望这在误差范围内,因为那没有意义。是的,有时它的简单性这是危险的,取决于
@language
的来源。i、 e.如果是“1=1;从用户中删除;”--“绝对,我假设这是一个固定列表。在所有答案中,列名永远不能为null,并且必须始终存在于数据库中。回答得体的话会得到额外的分数。是的,有时候答案很简单。这很危险,这取决于
@language
的来源。i、 e.如果是“1=1;从用户中删除;”--“绝对,我假设这是一个固定列表。在所有答案中,列名永远不能为null,并且必须始终存在于数据库中。对于一个能够优雅地处理这些问题的答案,可以获得额外的分数。这种方法处理速度最快,所以我选择了这种方法。不要这样认为-检查我的回答。这种方法处理速度最快,所以我选择了这种方法。不要这样认为-检查我的回答。虽然我喜欢@papirtiger的答案,但你也可以使用插值,这可能会更快(不打算把它放在凳子上)像这样
Word.where(“{@language}=>string)
虽然我喜欢@papirtiger的答案,但你也可以使用插值,它可能会更快(不打算把它放在凳子上),比如
Word.where(“{@language}=>string)
Word.column\u name是一个数组,其中include?未定义此答案是半完整的-这是一个非常好的主意,可以确保该列存在,但它不包括实际查询。您可以这样使用。
Word.where(Hash[@language,string])存在?如果Word.column\u name.include?(@language)
或者您可以像..
Word.column\u name.include?(@language)和&Word.where(Hash[@language,string])那样使用它.exists?
@papirtiger我明白了,var语言是在后端定义的,所以我不担心验证。Word.column\u name是一个数组,其中包含?未定义。这个答案是半完整的-这是一个非常好的主意,可以确保列存在,但它不包含实际的查询。您可以这样使用它。
Word.where(Hash[@language,string])是否存在?如果Word.column\u names.include(@language)
或者您可以像..
Word.column\u names.include(@language)和&Word.where(Hash[@language,string])一样使用它,其中(Hash[@language,string])存在?
@papirtiger我知道,var语言是在后端定义的,所以我不担心验证问题。