【问题标题】:Rails join two tables based on relation in thirdRails 根据第三个关系连接两个表
【发布时间】:2019-07-30 13:06:47
【问题描述】:

我想加入 2 个表,但我需要使用 3th 来设置它们之间的关系。

每个订单都由一名员工准备。我只想为特定员工查找 OrderDetails。要检查这一点,我需要找到分配给车间订单的人员。

我几乎可以肯定我知道如何在 SQL 中执行此操作。只是概念查询:

SELECT OrderDetails.payment_id FROM OrderDetais
    INNER JOIN ShopOrders ON ShopOrders.id = OrderDetails.shop_order_id
    INNER JOIN Employees ON Employees.id = ShopOrders.employee_id
WHERE Employees.id IN (5, 6, 8)

我只是想在 Rails 中写同样的东西:

query = OrderDetail
        .where('order_details.created_at > ? AND order_details.created_at < ?', 1.year.ago, 2.days.ago)
query = query.joins(:shop_order)

我使用to_sql 来检查我的查询是否看起来不错。一切顺利,直到我加入 query.joins(: employee)

query = OrderDetail
        .where('order_details.created_at > ? AND order_details.created_at < ?', 1.year.ago, 2.days.ago)
query = query.joins(:shop_order)
query = query.joins(:employee)

然后我收到一个错误:

ActiveRecord::ConfigurationError: 无法将“OrderDetail”加入名为“employee”的关联;也许你拼错了?>

我尝试关注Joining Nested Associations (Multiple Level)。但是我不知道如何正确使用它。

在 OrderDetail 模型中有:

delegate :employee, to: :shop_order, allow_nil: true

在 ShopOrder 模型中:

  belongs_to :employee, optional: false
  has_many :order_details, dependent: :restrict_with_error

和Employee模型:

  has_many :shop_orders
  has_many :order_details, through: :shop_orders

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    根据您提供的“加入嵌套关联(多级)”参考,以下内容应该可以满足您的需求:

    query
      .joins(shop_orders: :employee)
      .where(employees: { id: [5, 6, 8] })
    

    【讨论】:

    • 我在文档中看到了这一点,但我收到同样的错误“无法将 'OrderDetail' 加入名为 'employee' 的关联;`
    • @eudaimonia 如果您使用此答案中提供的解决方案,您将不会收到该错误。如果有的话,那就是Can't join 'ShopOrder' to association named 'employee',根据您的帖子也不会发生
    • 是的第二个。但.joins(shop_order: :employee) 解决了这个问题
    【解决方案2】:

    我是这样解决的:

    query.joins(:shop_order)
         .joins('JOIN employees ON employees.id = shop_orders.employee_id')
         .where(employees: { id: [5, 6, 8] })
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2021-05-17
      • 2013-03-19
      • 2011-01-18
      相关资源
      最近更新 更多