Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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:结合普通比较和按位比较_Ruby_Comparison_Bit Manipulation - Fatal编程技术网

Ruby:结合普通比较和按位比较

Ruby:结合普通比较和按位比较,ruby,comparison,bit-manipulation,Ruby,Comparison,Bit Manipulation,这似乎是一个愚蠢的简单问题。我正在搜索一个用户列表,使用位运算符确定名字和姓氏是否与提供的术语匹配(我没有编写此代码,这是遗留代码) 现在我需要添加第三个条件-它们的状态不是“禁用”。如果没有第三个条件,搜索将按预期工作。但是,当我添加另一个and语句时,它会中断 @users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i } #Works as expec

这似乎是一个愚蠢的简单问题。我正在搜索一个用户列表,使用位运算符确定名字和姓氏是否与提供的术语匹配(我没有编写此代码,这是遗留代码)

现在我需要添加第三个条件-它们的状态不是“禁用”。如果没有第三个条件,搜索将按预期工作。但是,当我添加另一个and语句时,它会中断

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i } #Works as expected - returns users matching 'term'

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i && user.suspended? } # Does not work - returns a full list of active users, as well as any suspended users that match.

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i }
@users.reject!{|user| user.suspended?} # This combination works, but I feel like there should be a way to condense it into a single line
我还尝试在前两个条件周围添加一些括号,但这也没有帮助


非常感谢您提供的任何帮助

如果您将这些条件中的一些移动到命名范围中,可能会有所帮助。此外,这将把您的搜索转移到MySQL中。我想知道这将如何影响性能

scope :first_name_not_like, lambda {|term| where(["first_name NOT RLIKE '^#{?}'", term])}
scope :last_name_not_like, lambda {|term| where(["last_name NOT RLIKE '^#{?}'", term])}
scope :not_suspended, lambda { where(["suspended NOT true"])}
或者类似的

那你就可以了

@users = User.first_name_not_like(term).last_name_not_like_(term).not_suspended

如果将这些条件中的一些移动到命名范围中,可能会有所帮助。此外,这将把您的搜索转移到MySQL中。我想知道这将如何影响性能

scope :first_name_not_like, lambda {|term| where(["first_name NOT RLIKE '^#{?}'", term])}
scope :last_name_not_like, lambda {|term| where(["last_name NOT RLIKE '^#{?}'", term])}
scope :not_suspended, lambda { where(["suspended NOT true"])}
或者类似的

那你就可以了

@users = User.first_name_not_like(term).last_name_not_like_(term).not_suspended

这里没有按位操作,
~
是一个否定的正则表达式匹配(认为“不匹配”)

对于您的实际问题:

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i || user.suspended? }

基本上是这样说的:“如果这个名字和姓氏与提供的正则表达式不匹配,或者如果用户被挂起,则拒绝用户”。您的版本仅适用于具有无效名称的用户,这些用户也处于挂起状态(因为
&&&
)。

此处没有按位操作,
~
是一个否定的正则表达式匹配(认为“不匹配”)

对于您的实际问题:

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i || user.suspended? }

基本上是这样说的:“如果这个名字和姓氏与提供的正则表达式不匹配,或者如果用户被挂起,则拒绝用户”。您的版本只适用于名称无效的用户,这些用户也被挂起(因为
&&
)。

我认为您的最终
&
应该是
|

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i || user.suspended? }

我认为你最后的
&
应该是
|

@users = User.reject{|user| user.first_name !~ /^#{term}/i && user.last_name !~ /^#{term}/i || user.suspended? }
读一下德摩根的法律,读一下德摩根的法律,