首页 > 解决方案 > Rails 关联在哪里 - 为什么不检查类?

问题描述

假设我有一个带有Users模型和 s 模型的 rails 应用程序Account。用户和帐户之间存在多对多关联(为了论证),并且有一个关联模型UserAccount

如果我想检查用户 1 是否是帐户 1 的所有者,我可以执行以下查询:

UserAccount.exists?(user_id: 1, account_id: 1)

另一方面,我可以这样做:

user = User.find(1)
acc = Account.find(1)
UserAccount.exists?(user: user, account: acc)

我之前假设这些是等价的,除了表格 (2) 将检查关联的类。例如,如果我做了:

UserAccount.exists?(user: acc, account: acc)

我本来希望得到一个错误,因为acc是一个Account,而不是一个User。Rails 知道这一点,因为它从列中推断出关联的类。

令我沮丧的是,我只是尝试了上述方法(相当于),现在我认为 rails 在以这种方式查询关联时根本不会进行类检查。因此我有两个问题:

编辑:我应该注意,这种行为基本上与 Rails在其他情况下所做的类型检查不一致。例如,以下代码段引发类型错误:

irb(main):021:0> User.update(account: NotAnAccount.new)
  User Load (3.5ms)  SELECT `users`.* FROM `users`
   (0.6ms)  BEGIN
   (0.8ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):21
ActiveRecord::AssociationTypeMismatch (Account(#47453450812560) expected, got #<NotAnAccount ... > which is an instance of NotAnAccount(#47453450812561)

标签: ruby-on-railsvalidationactiverecord

解决方案


推荐阅读