ruby Rails -作用域上的逻辑运算符,这可能吗?

rslzwgfq  于 12个月前  发布在  Ruby
关注(0)|答案(3)|浏览(89)

我有一个类,它代表一个有两个作用域的游戏(比赛):

scope :home_lineuped, ->() { includes(:home_lineup).where(home_lineup: {lineuped: true }) }
  scope :away_lineuped, ->() { includes(:away_lineup).where(away_lineup: {lineuped: true }) }

我想创建一个新的范围与逻辑运算符 * 不和 * 的结果,这是可能的吗?

**编辑:**我是什么意思?

想象一下:Match.All给我匹配ID,1,2,3,4,56;
Match.home_lineuped给我匹配ID,1,26;
Match.away_lineuped给我匹配ID 3,46;
结果:(Match.home_lineuped AND Match.away_lineuped)是:6
因此:Not (Match.home_lineuped AND Match.away_lineuped)将导致与ID匹配:1,2,3,4,5

结束编辑

此致:
大卫

up9lanfz

up9lanfz1#

你的意思是Match.home_lineuped & Match.away_lineupedMatch.all - (Match.home_lineuped & Match.away_lineuped)
或创建新范围
scope :home_lineuped_and_away_lineuped, ->() { includes(:home_lineup, :away_lineup).where(home_lineups: {lineuped: true }, away_lineups: {lineuped: true }) }
scope :not_home_lineuped_and_away_lineuped, ->() { includes(:home_lineup, :away_lineup).where.not(home_lineups: {lineuped: true }, away_lineups: {lineuped: true }) }

ljsrvy3e

ljsrvy3e2#

根据Rails的版本,ActiveRecord确实有一个not方法。希望能帮上忙。

8aqjt8rx

8aqjt8rx3#

scope :home_lineuped, -> { includes(:home_lineup).where(home_lineup: {lineuped: true }) }
scope :away_lineuped, -> { includes(:away_lineup).where(away_lineup: {lineuped: true }) }

你可以像这样一个接一个地调用AND逻辑的作用域:

Match.home_lineuped.away_lineuped

但是如果你需要作用域,你可以将两个作用域合并为:

scope :home_and_lineuped, -> do
  includes(:home_lineup, :away_lineup).
    where(home_lineup: {lineuped: true }, away_lineup: {lineuped: true })
end

对于相反的逻辑(NOT AND),你可以使用not

scope :no_home_away_lineuped, -> do
  includes(:home_lineup, :away_lineup).
    where.not(home_lineup: {lineuped: true }, away_lineup: {lineuped: true })
end

相关问题