【问题标题】:Self Join on a Table using Ruby on Rails ActiveRecord使用 Ruby on Rails ActiveRecord 在表上自联接
【发布时间】:2018-08-27 06:17:52
【问题描述】:

我有一个名为 Transaction 的 ActiveRecord 模型。 每笔交易有四个字段:

  • 交易 ID
  • 交易类型
  • 用户 ID
  • 父事务ID

Transaction还有另外两种类型:

  • 借记交易
  • 回报交易

对于每个 Payback Transaction,Debit Transaction 的 TransactionID 都会在 Parent TransactionID 字段中提及。

使用 ActiveRecord 查询,我必须找到特定用户 ID 的未付借记交易。


示例数据:

TransactionID Type of Transaction UserID Parent TransactionID
123           Debit               1      null
124           Debit               1      null
125           Credit              1      123
127           Debit               1      null

查询以上数据应该返回Transactions:124, 127

【问题讨论】:

  • DebitTransaction 有很多PaybackTransactions 对吗?
  • 一个PaybackTransaction只有一个DebitTransaction
  • 试试这个Transaction.where(parent_transaction_id: nil, type: 'Debit').where.not(id: Transaction.select(:parent_transaction_id).uniq)
  • @HardikUpadhyay 您的解决方案有效,但不使用子查询和使用自联接表语句是否可行?
  • @shril 是的,你可以。您必须编写自定义关联。请看stackoverflow.com/questions/17476521/…

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


【解决方案1】:
class Transaction < ApplicationRecord
  has_one :payback_transaction, class_name: 'Transaction', foreign_key: :parent_transaction_id
  belongs_to :debit_transaction, class_name: 'Transaction', foreign_key: :parent_transaction_id, optional: true

https://guides.rubyonrails.org/association_basics.html#self-joins

如果您希望每次借记有多个回报,您可能需要has_many 而不是has_one

【讨论】:

  • 谁能帮我解决上述问题的 ActiveRecord 查询?每个DebitTransaction 的记录都有一个PaybackTransaction
  • @shril 以上有什么问题?这是一个ActiveRecord 要求的关联。 Transaction.find(123).payback_transaction 将导致 Transaction 125 这似乎是您想要的结果。虽然属于也需要一个外键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多