Ruby on rails 从变量中查找重复项的查询列
我想检查表列中是否已经存在字符串。列名采用字符串形式,@language='german',列名为德语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
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语言是在后端定义的,所以我不担心验证问题。