Ruby on rails 如何在Rails中实现相反的合并?

Ruby on rails 如何在Rails中实现相反的合并?,ruby-on-rails,Ruby On Rails,目前,我有两种型号 class Project has_one: user end class User # Attributes # active: Boolean # under_18: Boolean scope :can_work, -> { where(active: true, under_18: false) } end 查询代码 Project.all.joins(:user).merge(User.can_work) 目前,上述代码

目前,我有两种型号

class Project
   has_one: user

end

class User
   # Attributes
   # active: Boolean
   # under_18: Boolean

   scope :can_work, -> { where(active: true, under_18: false) }
end
查询代码

Project.all.joins(:user).merge(User.can_work)
目前,上述代码正在工作,但如果可能的话,我想做相反的事情

Project.all.joins(:user).merge(User.can_work, false) # not working obviously, just an example of my thought
我知道可以创建另一个类似的作用域

User.can_not_work #
但是我想否定查询中的作用域,而不是创建另一个作用域

编辑:

我正在添加真值表,以防有人对我为什么不使用负作用域感到困惑

active |  under_18
------------------
   T        T        = F
   T        F        = T   (I know its a bit weird It should just be F but its the condition)
   F        T        = F
   F        F        = F
我不确定如何对上述逻辑进行负作用域。提前感谢

您可以使用:

还可以将散列作为参数传递给unscope-specific:where值。这是通过使用单个键值对传递散列来完成的。键应该是:where,值应该是要取消作用域的where值

在Rails 6.1上,您可以使用


这回答了你的问题吗?老实说,定义一个范围:
User.cannot_work
可能是个好主意!。。。我知道这是对你问题的懒散回答,但我会坚持下去。@TomLord是的,你是对的,但我浏览了我的真值表,如果我使用负范围,某些条件可能无法正常工作,或者我的知识可能局限于定义正确的否定范围。@TomLord我添加了真值表。你知道如何划分该范围的逻辑吗?否定范围是:
where('active=false或under_18=true')
。谢谢你的帮助,这不起作用,它只会在clausemy rails版本仍然是6.0.0的地方起作用,我猜是这样的。
Project.all.joins(:user)
           .merge(User.can_work)
           .unscope(where: :active)
           .unscope(where: :under_18)
Project.all.joins(:user).merge(User.can_work.invert_where)