如何使用Rails关联访问值

时间:2018-03-06 10:11:47

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

所以,我试图了解轨道中的协会(我使用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

3 个答案:

答案 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付款。

你应该添加:

    您的bank_account模型
  • 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