【问题标题】:Rails EXCEPT query (filter out records present in a joint table)Rails EXCEPT 查询(过滤掉联合表中的记录)
【发布时间】:2023-03-23 08:29:01
【问题描述】:

我正在尝试列出与尚未创建的另一个模型关联的模型实例。

这是我的模型的关联方式:

Ticket.rb:

has_one :purchase
has_one :user, through: :purchase

用户.rb:

has_many :purchases
has_many :tickets, through: :purchases

Purchase.rb:

belongs_to :ticket
belongs_to :user

我有一个 SQL 查询,但在将其转换为 rails 时遇到了麻烦:

SELECT id FROM tickets
EXCEPT
SELECT ticket_id FROM purchases;

它非常好用,因为它返回了所有尚未购买的门票的 id。

我试过了:

Ticket.joins('LEFT JOIN ON tickets.id = purchases.ticket_id').where(purchases: {ticket_id: nil})

但这似乎不是正确的方向。

【问题讨论】:

  • Ticket.joins('LEFT JOIN ON tickets.id = purchases.ticket_id').where(purchases: {ticket_id: nil} 您忘记指定表名,例如Ticket.joins('LEFT JOIN purchases ON tickets.id = purchases.ticket_id').where(purchases: {ticket_id: nil}

标签: ruby-on-rails ruby postgresql activerecord associations


【解决方案1】:

如果您只是想获取没有关联购买的Ticket 记录列表,请改用.includes。根据我的经验,join 将失败且没有关联记录,这将使您无需编写任何实际的 SQL。

Ticket.includes(:purchase).where(purchases: { ticket_id: nil} )

生成的 SQL 查询对于人类来说有点难以阅读,但我已经使用了几次,并没有看到任何真正的性能差异。

【讨论】:

  • 起初没有注意到您的 Ticket 模型与购买有has_one 关系。对于has_one,include 需要使用单数,而 where 使用复数。在刚才的答案中修复了这个问题。
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多