【问题标题】:SQL Query JOIN table through ActiveRecord relationsSQL 通过 ActiveRecord 关系查询 JOIN 表
【发布时间】:2018-01-20 17:26:51
【问题描述】:

使用 ActiveRecord 关系,我设置了一个域,通过它我无法找出正确的查询来检索所需的信息。这可能不是理想的模型,但对于我的项目,我需要使用包含关系信息的连接模型。

我想过滤连接表,只返回状态为dealership_vehicles.is_lot_ready = 'f' 或't' 的车辆。无论哪种方式,我想出的最接近的事情就是查询

SELECT *
FROM vehicles
INNER JOIN dealership_vehicles ON vehicles.dealership_vehicle_id = dealership_vehicles.id
WHERE dealership_vehicles.is_lot_ready = false;

起初我认为它有效,但在调查数据后,它带回了太多结果,当查询更改为“f”时,它没有带回任何数据。

我不知道为什么,任何建议将不胜感激。

class Dealership < ApplicationRecord
has_many :dealership_vehicles
has_many :vehicles, :through => :dealership_vehicles

class Vehicle < ApplicationRecord
belongs_to :dealership_vehicle
has_one :dealership, :through => :dealership_vehicle

class DealershipVehicle < ApplicationRecord
belongs_to :dealership
has_many :vehicles

以及表格中的以下数据:

vehicles
 id |  make  |  model  | year | dealership_vehicle_id |         created_at         |         updated_at
  1 | BMW    | M3      | 2016 |                     1 | 2018-01-20 16:59:13.196586 | 2018-01-20 16:59:13.196586
  2 | Toyota | Corolla | 2016 |                     2 | 2018-01-20 16:59:13.1998   | 2018-01-20 16:59:13.1998

dealerships
   id | name  |    city     |         created_at         |         updated_at
    1 | Ereve | Lith Harbor | 2018-01-20 16:59:13.067827 | 2018-01-20 16:59:13.067827
    2 | Rien  | Ellinia     | 2018-01-20 16:59:13.070359 | 2018-01-20 16:59:13.070359

dealership_vehicles
 id | dealership_id | is_lot_ready | buyer  | price |         created_at         |         updated_at         | permission
 28 |             4 | f            | Randy  | 30099 | 2018-01-20 16:59:13.183475 | 2018-01-20 16:59:13.183475 |
 27 |             3 | t            | Philip | 30099 | 2018-01-20 16:59:13.180412 | 2018-01-20 16:59:13.180412 |

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    在我看来,您只是缺少 't''f' 周围的单引号,因为您似乎正在使用文字字符串。

    例如:

    SELECT *
    FROM vehicles
    INNER JOIN dealership_vehicles ON vehicles.dealership_vehicle_id = dealership_vehicles.id
    WHERE dealership_vehicles.is_lot_ready = 'f';
    

    另外,如果您的表仅包含示例中的数据,您将无法找到任何结果,因为没有相关的 ID's。

    看看我的意思,它们不匹配所以你不能JOIN

    【讨论】:

    • 不幸的是,运行该查询,返回零行,我希望返回一行,因为只有一辆车的状态设置为 false。将标志更改为true,大多数记录都带有正确的标志
    • 表示例中的数据不会返回任何结果,因为 dealership_vehicles 中的 ID 是 27 和 28,与 vehicles.dealership_vehicle_id 没有关联的行(它们是 1 和 2)。如果vehicles.dealership_vehicle_id 是 27 或 28,您将分别得到 't' 或 'f' 结果
    • 你一提到我就去检查了我的数据。我错误地填充了数据库。车辆表dealership_vehicle_id 只增加到6。感谢您的快速回复!
    【解决方案2】:

    Vehicle.joins(:dealership_vehicle).where(dealership_vehicles: {is_lot_ready: "f"})

    【讨论】:

    • 我如何在 is_lot_ready 中使用占位符:'?',我试图让它响应传入的变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多