【问题标题】:Rails active record #or must be structurally compatible queryRails 活动记录 #or 必须是结构兼容的查询
【发布时间】:2022-11-24 01:33:24
【问题描述】:

我需要查询所有具有programsfuture_end_date_sessionsproducts或所有具有pathsfuture_end_date_sessions的产品

协会如下:

Product :
  belongs_to :learning_item, polymorphic: true
    has_one :self_ref, class_name: to_s, foreign_key: :id
    has_one :program, through: :self_ref, source: :learning_item, source_type: 'Program'
    has_one :path, through: :self_ref, source: :learning_item, source_type: 'Path'

Program has_many sessions
Path has_many sessions

我想出了以下查询:

 Product.joins(program: :future_end_date_sessions).or(
          Product.joins(path: :future_end_date_sessions)
        )

但是我收到以下错误ArgumentError: Relation passed to #or must be structurally compatible. Incompatible values: [:joins] 我该如何解决这个问题?

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    所以实际问题是 Product.joins(program: :future_end_date_sessions)Product.joins(path: :future_end_date_sessions) 有不同的 JOIN 标准,因此不能合并在一起。

    在我看来,最简单的解决方案是

    Product.where(id: Product.joins(program: :future_end_date_sessions).select(:id).distinct)
      .or(Product.where(id: Product.joins(path: :future_end_date_sessions).select(:id).distinct))
    

    这将导致 OR 条件利用 2 个子查询从您当前的连接条件中提取必要的产品 ID。

    或者,我们可以使用 Arel 创建连接,但我不知道 :future_end_date_sessions 是什么或它是如何工作的,所以我现在不确定如何完成此操作。

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 2021-10-24
      • 1970-01-01
      • 2019-06-26
      • 2017-04-06
      • 2013-02-01
      • 1970-01-01
      • 2018-02-25
      • 2019-12-16
      相关资源
      最近更新 更多