我需要查询所有具有programs
和future_end_date_sessions
的products
或具有paths
和future_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]
如何解决这个问题?
所以实际的问题是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))
这将导致使用两个子查询从当前连接条件中提取必要的Product id的OR条件。
或者,我们可以使用Arel
创建一个连接,但是我不知道:future_end_date_sessions
是什么,也不知道它是如何工作的,所以我不确定如何实现这一点。