Rails 在连接表上加入条件
Posted
技术标签:
【中文标题】Rails 在连接表上加入条件【英文标题】:Rails Joins with Condition on Joined Table 【发布时间】:2020-11-06 22:50:32 【问题描述】:我正在使用 Rails 6。我有一个 Order
表和一个 Address
表。 Order
has_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条件关联的记录