Rails 在连接表上加入条件

Posted

技术标签:

【中文标题】Rails 在连接表上加入条件【英文标题】:Rails Joins with Condition on Joined Table 【发布时间】:2020-11-06 22:50:32 【问题描述】:

我正在使用 Rails 6。我有一个 Order 表和一个 Address 表。 Orderhas_many :addresses。每个订单都包含对两个地址字段的引用,一个用于计费,另一个用于运输。如果送货记录与账单记录相同,则将送货地址记录的same_as_billing字段设置为true,并将所有地址数据存储在账单地址记录中。

我正在尝试查询所有具有逻辑送货地址且国家/地区设置为“美国”的订单。我通常会通过这样的常规连接来完成此操作:

Order.all.joins(:addresses).where(addresses: address_type: "Shipping", country: "United States")

但是,由于某些送货地址可能标有same_as_billing = true,因此实际上没有地址数据存储在这些记录中,而是存储在帐单地址记录中。我不确定如何查询送货地址记录,然后如果same_as_billing = true 有条件地加入账单地址记录。每个Order 总是有两个地址关联。

【问题讨论】:

我认为您想要 EXISTS 子查询之类的东西 - 请告诉我们您正在使用什么数据库并提供模型示例,以便我们可以对其进行测试,而无需从头开始重新创建所有内容? 【参考方案1】:

据我了解,您应该可以使用or 查询来实现此目的。

shipping_addresses = Order.all.joins(:addresses).where(addresses:  address_type: 'Shipping', country: 'United States' )
billing_addresses = Order.all.joins(:addresses).where(addresses:  address_type: 'Billing', country: 'United States', same_as_billing: true )

valid_addresses = shipping_addresses.or(billing_addresses)

【讨论】:

以上是关于Rails 在连接表上加入条件的主要内容,如果未能解决你的问题,请参考以下文章

Rails N + 1查询问题时获取与where条件关联的记录

在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串

Rails 3 - 具有连接条件的多个数据库

ruby on rails 连接条件(带 squeel)

使用右表上的总和分组对多列进行 SQL 连接

日期不匹配时连接两个表