如何解决联接表中的ActiveRecord定制外键仅在一个方向上起作用
Table name: bank_accounts
id :integer not null,primary key
number :string(255)
...
Table name: beneficiary_bank_accounts
id :integer not null,primary key
beneficiary_id :integer
bene_bank_account_id :integer
Table name: beneficiaries
id :integer not null,primary key
name :string(255)
...
class BankAccount < ApplicationRecord
has_many :beneficiary_bank_accounts,dependent: :destroy
has_many :beneficiaries,through: :beneficiary_bank_accounts
...
end
class BeneficiaryBankAccount < ApplicationRecord
belongs_to :beneficiary
belongs_to :bene_bank_account,class_name: 'BankAccount',foreign_key: 'bene_bank_account_id'
...
end
class Beneficiary < ApplicationRecord
has_many :beneficiary_bank_accounts,dependent: :destroy
has_many :bene_bank_accounts,through: :beneficiary_bank_accounts,class_name: 'BankAccount'
...
end
在两个表之间有一个has_many
贯通排列,一个连接表如上图所示,在BankAccount
和Beneficiary
之间以BeneficiaryBankAccount
作为连接表。
名称与另一个定义发生冲突,需要在连接表中重命名一个外键,以帮助ActiveRecord正确推断连接关系。
如您所见,在联接表BeneficiaryBankAccount
中,class_name以及bene_bank_account_id
列上的外键都已被覆盖。
我遇到的问题是:
Beneficiary.last.bene_bank_accounts
产生正确的sql
SELECT bank_accounts.*
FROM bank_accounts
INNER JOIN beneficiary_bank_accounts ON bank_accounts.id = beneficiary_bank_accounts.bene_bank_account_id WHERE beneficiary_bank_accounts.beneficiary_id = 111
ORDER BY bank_accounts.title ASC
但是,从相反的方向来看,不是。
BankAccount.last.beneficiaries
产生不正确的sql,忽略了foreign_key覆盖
SELECT beneficiaries.*
FROM beneficiaries
INNER JOIN beneficiary_bank_accounts ON beneficiaries.id = beneficiary_bank_accounts.beneficiary_id
WHERE *beneficiary_bank_accounts.bank_account_id* = 135
我尝试将Foreign_key添加到BankAccount
模型中,如下所示:
has_many :beneficiaries,foreign_key: 'bene_bank_account_id'
这没什么区别。
除了使用原始SQL之外,我找不到在BankAccount
-> Beneficiary
方向上覆盖命名约定的方法。
任何人都可以把我说对了。
解决方法
您应该可以通过指定关联来源来做到这一点。
class BankAccount < ApplicationRecord
...
has_many :bene_bank_accounts,through: :beneficiary_bank_accounts,class_name: 'BankAccount',source: :bene_bank_account
这样做的好处是您无需了解BeneficiayBankAccount如何与BankAccount建立关联的内部,您只是告诉Rails“使用现有的关联,无论它是什么”。
,似乎解决方案更简单。
有必要将定制外键添加到联接表has_many
本身,如下所示:
has_many :beneficiary_bank_accounts,dependent: :destroy,foreign_key: :bene_bank_account_id
class BankAccount < ApplicationRecord
has_many :beneficiary_bank_accounts,foreign_key: :bene_bank_account_id
has_many :beneficiaries,through: :beneficiary_bank_accounts
...
end
现在两个方向都能正常工作。
谢谢您的光临。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。