ruby-on-rails - Rails 关联在哪里 - 为什么不检查类?
问题描述
假设我有一个带有User
s模型和 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 在以这种方式查询关联时根本不会进行类检查。因此我有两个问题:
- 这是明确记录的吗?我读了这篇文章:https ://guides.rubyonrails.org/active_record_querying.html并没有发现任何相关内容。
- 有没有办法获得这个功能?在进行此类查询时,我真的很想进行某种检查。
编辑:我应该注意,这种行为基本上与 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)
解决方案
推荐阅读
- vb.net - 使用 vb .net 在 microsoft crm 中的电子邮件中添加本地 pdf 附件
- php - 重命名列 Laravel 5.8 后从表中删除数据
- tcp - Mule4 支持 TCP 连接
- xaml - Xamarin 表单中的导航问题
- laravel - 如何在 Lumen 中将文件上传到 AWS s3
- cuda - PTX 是否真的有 64 位 warp shuffle 指令?
- opencv - 如何将垂直线的表格图像拆分为三个图像?
- c - 我应该教 C89、C18 还是其他东西?
- php - 当我尝试命令 composer global require "laravel/installer" 时,这个错误在我的终端上意味着什么?
- powerbi - 现在可以在 DAX 中使用 ARIMA 模型进行预测吗?