【问题标题】:Relation passed to #or must be structurally compatible. Incompatible values: [:left_outer_joins] rails传递给 #or 的关系必须在结构上兼容。不兼容的值:[:left_outer_joins] rails
【发布时间】:2021-01-22 06:00:21
【问题描述】:

管理模型:

has_many :transport_vehicles_as_driver, class_name: "Transport::Vehicle",as: :driver 
has_many :transport_vehicles_as_attendant, class_name: "Transport::Vehicle",as: :attendant 
relation_1 = Admin.where(category: "TRANSPORT").left_outer_joins(:transport_vehicles_as_attendant).where("transport_vehicles.reference_code LIKE ?", "%#{keyword}%").distinct
relation_2 = Admin.where(category: "TRANSPORT").left_outer_joins(:transport_vehicles_as_driver).where("transport_vehicles.reference_code LIKE ?", "%#{keyword}%").distinct

relation_1.or(relation_2) 产生以下错误:

ArgumentError (Relation passed to #or must be structurally compatible. Incompatible values: [:left_outer_joins])

我检查了以下关闭的 stackoverflow 源: Relation passed to #or must be structurally compatible. Incompatible values: [:references]

【问题讨论】:

  • 您对这个查询的期望目标是什么?看起来你正在尝试做UNION ALL。错误试图告诉您,您不能将left_outer_joinor 一起使用,或者至少当这两个查询具有不同的left_outer_join 值时。
  • 是的,我正在尝试找到两个关系的联合..
  • 我认为你应该能够在没有联合的情况下在一个查询中编写它。唯一需要做的就是在 SQL 中编写自定义左连接,而不是通过关联符号的“rails”方式。它可能看起来像 .joins("LEFT JOIN (transport_vehicles.driver_id = admin.id AND transport_vehicles.driver_type='Admin') OR (transport_vehicles.attendant_id = admin.id AND transport_vehicles.attendant_type='Admin') ") 或类似的东西,我只是在猜测列名。

标签: ruby-on-rails


【解决方案1】:
Admin.where(category: "TRANSPORT").
  joins("LEFT JOIN transport_vehicles ON
        (transport_vehicles.driver_id = admins.id) OR (transport_vehicles.attendant_id = admins.id)").
  where("transport_vehicles.reference_code LIKE ?", "%#{keyword}%").distinct

【讨论】:

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