Ruby on rails 如何使用Rails关联访问值

Ruby on rails 如何使用Rails关联访问值,ruby-on-rails,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Ruby On Rails 5,Rails Activerecord,因此,我试图了解rails中的关联(我使用的是5.1.5) 我的工作部分正常,但我正在尝试获取bank.title,当我返回付款列表时,它用于关联的银行帐户 我似乎一辈子都无法解决这个问题,我该怎么做,或者有更好的方法吗 user has_many :payments has_many :bank_accounts has_many :banks, :through => :bank_accounts payments belongs_to :user # Refe

因此,我试图了解rails中的关联(我使用的是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

当您得到一个数组时,您必须对它进行迭代以获得标题(
user.banks.map(&:title)
是最短的一个)

这就是你现在所拥有的,你还不知道付款指的是哪家银行,因为一个用户可以有多家银行

如果要获取与付款关联的银行,需要在
付款
表中指定
银行id
,并将
所属银行
添加到
付款
模型中。因此,您可以从单个付款记录中获得:

payment.user
payment.bank

可以考虑对支付模型添加约束:

validates :user_id, presence: true
validates :bank_id, presence: true
validate :user_owns_bank
def user_owns_bank
  user.bank_accounts.include?(bank_account)
end
为了安全起见,验证指定用于支付的银行是否已归用户所有:

validate :user_owns_bank

def user_owns_bank
  user.banks.include?(bank)
end
--编辑--

所以你有一个关于付款的
银行账户id

您应该添加:

  • 在您的银行账户模型中有许多:付款
  • 属于:支付模式上的银行账户
因此,您可以通过以下方式访问:

payment.bank_account.bank.title
尽管如此,这个解决方案/设置是可以接受的,但我建议您根据我上面描述的内容重构它;我不会存储对联接表的引用。但只要有效,每个人都可以有自己的方法

但是,对帐户用户所有权的验证仍然适用,但应移到您的支付模式:

validates :user_id, presence: true
validates :bank_id, presence: true
validate :user_owns_bank
def user_owns_bank
  user.bank_accounts.include?(bank_account)
end

(最后一个是未经测试的;但更重要的是,要坚持这样一个事实,即这种验证非常有意义,您希望避免创建一个没有帐户的记录-但您可能已经计划好了,我没有看到所有代码)

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

user.banks

当您得到一个数组时,您必须对它进行迭代以获得标题(
user.banks.map(&:title)
是最短的一个)

这就是你现在所拥有的,你还不知道付款指的是哪家银行,因为一个用户可以有多家银行

如果要获取与付款关联的银行,需要在
付款
表中指定
银行id
,并将
所属银行
添加到
付款
模型中。因此,您可以从单个付款记录中获得:

payment.user
payment.bank

可以考虑对支付模型添加约束:

validates :user_id, presence: true
validates :bank_id, presence: true
validate :user_owns_bank
def user_owns_bank
  user.bank_accounts.include?(bank_account)
end
为了安全起见,验证指定用于支付的银行是否已归用户所有:

validate :user_owns_bank

def user_owns_bank
  user.banks.include?(bank)
end
--编辑--

所以你有一个关于付款的
银行账户id

您应该添加:

  • 在您的银行账户模型中有许多:付款
  • 属于:支付模式上的银行账户
因此,您可以通过以下方式访问:

payment.bank_account.bank.title
尽管如此,这个解决方案/设置是可以接受的,但我建议您根据我上面描述的内容重构它;我不会存储对联接表的引用。但只要有效,每个人都可以有自己的方法

但是,对帐户用户所有权的验证仍然适用,但应移到您的支付模式:

validates :user_id, presence: true
validates :bank_id, presence: true
validate :user_owns_bank
def user_owns_bank
  user.bank_accounts.include?(bank_account)
end

(最后一个是未经测试的;但更重要的是,要坚持这样一个事实,即这种验证非常有意义,您希望避免使用不属于自己的帐户创建记录-但您可能已经计划好了,我没有看到所有的代码)

您的代码似乎很好,您应该能够通过以下方式访问特定用户(例如id=1的用户)的付款:

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


您的代码似乎很好,您应该能够通过以下方式访问特定用户(例如id=1的用户)的付款:

这将为您提供第一个用户的所有付款列表,以及类似的用户银行列表(id=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 model对象访问银行名称

payment.bank.title

希望有帮助

您必须为银行对象添加一个与支付模型的
has_one
关系,该对象通过银行帐户连接,以便从支付模型访问它

# References: user_id and bank_account_id
payments
  belongs_to :user
  belongs_to :bank_account

  has_one :bank, through: :bank_account
现在,您可以使用payment model对象访问银行名称

payment.bank.title

希望有帮助

是的,我可以为一个用户收回所有付款,但我有一个与用户
银行账户相关联的付款,它引用银行模型上的银行id。:)然后可能你不应该有(用户有很多:付款),而是应该将银行账户和付款模式关联起来。这样用户可以通过银行账户查看其付款。当我为每个当前用户收回付款时,已经有了:)是的,我可以为用户收回所有付款,但是我有一个与用户
银行账户相关联的付款,它引用了银行模型上的银行id:)然后可能是你不应该有(用户有很多:付款)相反,您应该将银行帐户和付款模型关联起来。这样用户就可以通过银行帐户查看其付款。在我为每个当前用户收回付款时,已经有了这样的模型:)目前我有
付款。bank\u account\u id
返回用户的id
bank\u account
bank\u账户
引用了
bank\u id
,因此我可以获取
bank.title
。但是我的问题