Rails EXCEPT 查询(过滤出联合 table 中存在的记录)
Rails EXCEPT query (filter out records present in a joint table)
我正在尝试列出与已创建的另一个模型没有关联的模型实例。
以下是我的模型的关联方式:
Ticket.rb:
has_one :purchase
has_one :user, through: :purchase
User.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;
效果很好,因为它 returns 所有尚未购买的门票的 ID。
我试过这个:
Ticket.joins('LEFT JOIN ON tickets.id = purchases.ticket_id').where(purchases: {ticket_id: nil})
但好像方向不对
如果您只是想获取没有相关购买的 Ticket
记录列表,请改用 .includes
。以我的经验,join
会因没有关联记录而失败,这将使您无需编写任何实际的 SQL.
Ticket.includes(:purchase).where(purchases: { ticket_id: nil} )
生成的 SQL 查询对于人类来说有点难以阅读,但我已经使用了几次,并没有发现任何真正的性能差异。
我正在尝试列出与已创建的另一个模型没有关联的模型实例。
以下是我的模型的关联方式:
Ticket.rb:
has_one :purchase
has_one :user, through: :purchase
User.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;
效果很好,因为它 returns 所有尚未购买的门票的 ID。
我试过这个:
Ticket.joins('LEFT JOIN ON tickets.id = purchases.ticket_id').where(purchases: {ticket_id: nil})
但好像方向不对
如果您只是想获取没有相关购买的 Ticket
记录列表,请改用 .includes
。以我的经验,join
会因没有关联记录而失败,这将使您无需编写任何实际的 SQL.
Ticket.includes(:purchase).where(purchases: { ticket_id: nil} )
生成的 SQL 查询对于人类来说有点难以阅读,但我已经使用了几次,并没有发现任何真正的性能差异。