【问题标题】:Rails - Logical Operator on Scopes, is it possible?Rails - 范围上的逻辑运算符,这可能吗?
【发布时间】:2020-04-18 07:16:37
【问题描述】:

我有一个代表具有 2 个作用域的游戏(比赛)的类:

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

我想在结果上用逻辑运算符Not And创建一个新的范围,可以吗?

编辑:我是什么意思?

想象一下: 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

结束编辑

最好的问候,

大卫

【问题讨论】:

    标签: ruby-on-rails ruby activerecord scopes


    【解决方案1】:

    你的意思是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 }) }

    【讨论】:

    • scope 只是声明类方法的语法糖。如果您的方法不适合单行 lambda,则使用普通类方法定义以提高可读性。多行范围是一种代码味道。
    【解决方案2】:

    根据您使用的 Rails 版本,ActiveRecord 确实有一个not 方法。希望对您有所帮助。

    【讨论】:

    • 我在 Rails 5.2 上,你能给我举个例子吗?
    • @DavidSousa 除了链接中的例子吗?
    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-08
      • 2021-12-03
      • 2015-04-27
      • 2021-01-24
      • 2020-12-20
      • 1970-01-01
      • 2016-05-11
      相关资源
      最近更新 更多