Ruby:结合普通比较和按位比较
这似乎是一个愚蠢的简单问题。我正在搜索一个用户列表,使用位运算符确定名字和姓氏是否与提供的术语匹配(我没有编写此代码,这是遗留代码) 现在我需要添加第三个条件-它们的状态不是“禁用”。如果没有第三个条件,搜索将按预期工作。但是,当我添加另一个and语句时,它会中断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
@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? }
读一下德摩根的法律,读一下德摩根的法律,