我试图与使用Sequel gem的按位运算符一起工作,我想知道是否存在本机支持的方法。
现在我可以做的当然是
MySequelModel.where('bitcolumn & ?', '0001010')
但是,我正在做的是合并我生成的许多续集表达式,有点像这样:
sequel_query = queries.inject(Neutral) do |expression, a_hash|
expression & generate_query_from(a_hash)
end
然后,
generate_query_from(...)
将始终返回Sequel Expression对象。现在,当可能的返回值也可以改为"bitcolumn & '100010'"
时,这当然不再起作用。我尝试创建像
Sequel.expr("bitcolumn & '10001'")
或Sequel.expr(:bit_column) & Sequel.expr(value)
这样的Sequel表达式,但这都会导致Sequel :: Error:无效的过滤器表达式,即使后者使用> etc运算符也是如此。更新:
有趣的是,实际上可以将Sequel表达式与查询字符串合并,但是不会创建“正确”查询。而不是创建例如
"SELECT * FROM `users` WHERE ((`bitcolumn` = '000001') AND bitcolumn & '000001')"
它创建:
"SELECT * FROM `users` WHERE ((`bitcolumn` = '000001') AND 'bitcolumn & \\'000001\\'')"
这不起作用。
但也许我的用法:
Sequel.expr(bitcolumn: '000001') & "bitcolumn & '000001'"
是不正确的,可以修复。此外,如果我的第一个返回查询是字符串:
query_string & sequel_expression
当然会失败。更新2:
现在,我发现http://sequel.jeremyevans.net/rdoc/files/doc/sql_rdoc.html#label-Bitwise+Mathematical+Operators+-28-26+-7C+-5E+-3C-3C+-3E-3E+-7E-29似乎是最合适的方法,但是这样做:
[54] pry(main)> exp = Sequel.expr(:bit_column).sql_number & 1
=> #<Sequel::SQL::NumericExpression @op=>:&, @args=>[#<Sequel::SQL::Identifier @value=>"bit_column">, 1]>
[55] pry(main)> User.where(exp).sql
也会导致错误
Sequel::Error: Invalid filter expression: #<Sequel::SQL::NumericExpression @op=>:&, @args=>[#<Sequel::SQL::Identifier @value=>"bit_column">, 1]>
最佳答案
好的,因此我设法通过使用Sequel.lit使其正常工作。Sequel.lit("bit_column & 1") & Sequel.expr('bit_column' => 1)
返回"SELECT * FROM 'users' WHERE (cars_owned & 20 AND ('device' = 8))"
,这是正确的查询并且有效。
我仍然确定使用适当的按位数学运算符会有更好的方法,因此我将保持打开状态。
关于mysql - Sequel gem中的MySQL按位运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46295076/