如何使用Rails关联访问值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Rails关联访问值相关的知识,希望对你有一定的参考价值。

所以,我试图了解rails中的Associations(我正在使用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 用于关联的银行帐户。

我似乎无法为我的生活做出努力,我将如何解决这个问题还是有更好的方法来做到这一点?

user.banks
答案

如果您的设置工作正常,您应该能够检索相对于一个用户的银行数组:

payment.user.banks

要么

user.banks.map(&:title)

当你得到一个数组时,你必须迭代它才能获得标题(bank_idbeing是最短的一个)

这就是你现在所拥有的,你不知道(还)支付银行所指的银行,因为单个用户可以有很多银行。

如果您想让银行与付款相关联,您需要在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付款。

你应该添加:

  • 你的bank_account模型上的belongs_to :bank_account
  • payment.bank_account.bank.title 付款模式

那么你可以通过以下方式达到:

validate :user_owns_bank
def user_owns_bank
  user.bank_accounts.include?(bank_account)
end

不过,这个解决方案/设置是可以接受的,但我建议你从我上面描述的内容中重构它;我不会存储对连接表的引用。但只要有效,每个人都可以采用自己的方法。

虽然该帐户的用户所有权验证仍然适用,但应移至您的付款模式:

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

现在,您可以使用付款模型对象访问银行名称

@user = User.first
@user.payments

希望能帮助到你 !

另一答案

您的代码似乎没问题,您应该能够访问特定用户(例如id = 1的用户)的付款

@user = User.first
@user.banks

这将为您提供第一个用户的所有付款的列表,以及类似的用户银行列表(id = 1),

qazxswpoi

以上是关于如何使用Rails关联访问值的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 查询接口:使用关联模型

如何创建与 Ember.js 和 Rails 关联的 belongsTo 记录?

如何使控制台中的视图缓存片段过期?

Rails - 如何在保存后刷新关联

Ruby on Rails - 使用符号数组获取对象关联值

通过深度关联访问 rails 属性