所以,我试图了解轨道中的协会(我使用5.1.5)。
我有部分工作,但是当我收到付款清单时,我正在尝试获取相关银行帐户的bank.title
。
在我的生活中,我似乎无法解决这个问题,我将如何解决这个问题,还是有更好的方法来做到这一点?
user
has_many :payments
has_many :bank_accounts
has_many :banks, :through => :bank_accounts
payments
belongs_to :user
# References: user_id and bank_account_id
bank_account
belongs_to :user
belongs_to :bank
# References: user_id and bank_id
bank
has_many :bank_accounts
# Has a field title I would like to access
答案 0 :(得分:1)
如果您的设置正常,您应该能够检索相对于一个用户的银行数组:
user.banks
或
payment.user.banks
当你得到一个数组时,你必须迭代它才能得到标题(user.banks.map(&:title)
是最短的一个)
这就是你现在所拥有的,你还不知道付款所涉及的银行,因为单个用户可以有很多银行。
如果您想让银行与付款相关联,您需要在bank_id
表格中指定payments
,然后将belongs_to :bank
添加到您的payment
模型中。所以你可以从一张付款记录中获得:
payment.user
payment.bank
可以考虑在付款模式中添加约束:
validates :user_id, presence: true
validates :bank_id, presence: true
为确保安全,请确认指定付款的银行已由用户拥有:
validate :user_owns_bank
def user_owns_bank
user.banks.include?(bank)
end
<强> - 编辑 - 强>
因此,您有bank_account_id
付款。
你应该添加:
has_many :payments
belongs_to :bank_account
那么你可以通过以下方式获得它:
payment.bank_account.bank.title
不过,这个解决方案/设置是可以接受的,但我建议你从我上面描述的内容中重构它;我不会存储对连接表的引用。但只要它有效,每个人都可以采用它的方法。
但帐户的用户所有权验证仍然适用,但应移至您的付款方式:
validate :user_owns_bank
def user_owns_bank
user.bank_accounts.include?(bank_account)
end
(最后一个未经测试;但更多的是坚持这个非常有效的验证,你想避免创建一个帐户没有的记录 - 但你可能已经计划好了,我没有看到你的所有代码)
答案 1 :(得分:1)
您必须为银行对象的付款模式添加has_one
关系,该付款模式通过银行帐户连接,以便从付款模式进行访问。
# References: user_id and bank_account_id
payments
belongs_to :user
belongs_to :bank_account
has_one :bank, through: :bank_account
现在,您可以使用付款模式对象访问银行名称
payment.bank.title
希望它有所帮助!
答案 2 :(得分:0)
您的代码似乎没问题,您应该能够通过
访问特定用户(例如id = 1的用户)的付款@user = User.first
@user.payments
这将为您提供第一个用户的所有付款清单,以及用户银行清单(ID = 1),
@user = User.first
@user.banks