ruby-on-rails - Rails STI 子类在查询父类时被加载
问题描述
我正在使用带有 Rails 6.0.3.3 和 Ruby 2.6.6 的 STI 模式,如下所示:
class User end;
class User::Donor < User end;
class User::Legal < User::Donor end;
其中捐助者和法律本身代表两种类型。
由于共享功能,我继承了 User::Legal 和 User::Donor。
我的User::Legal
数据库中有一个类型记录。
当我尝试时在rails控制台中
1) User::Donor.first # returns nil
2) User::Legal.first # returns user_legal_obj
3) User::Donor.first # returns user_legal_obj
// Query
1) SELECT "users".* FROM "users" WHERE "users"."type" = $1 LIMIT $2 [["type", "User::Donor"], ["LIMIT", 1]]
2) SELECT "users".* FROM "users" WHERE "users"."type" = $1 LIMIT $2 [["type", "User::Legal"], ["LIMIT", 1]]
3) SELECT "users".* FROM "users" WHERE "users"."type" IN ($1, $2) LIMIT $3 [["type", "User::Donor"], ["type", "User::Legal"], ["LIMIT", 1]]
有谁知道为什么 Rails 会做出这种影响我输出的奇怪行为?
解决方案
实际上我没有重现描述中的不一致行为(两个User::Donor.first
打印不同的结果)。在您的 rails 控制台会话期间,您的文件或数据库是否被修改?
如果你的意思是User::Donor
查询时得到结果User::Legal
很奇怪,答案是:这是预期的行为,这就是为什么它被称为“继承”。
这个概念来自面向对象编程,意思是“是一个”。在这里,您User::Legal
继承自User::Donor
,User::Legal
a 也是如此User::Donor
。查询User::Donor
记录时,User::Legal
也应出示。
请参阅 rails 文档中的“单表继承”:https ://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
推荐阅读
- react-native - createBottomTabNavigator:未定义不是函数
- mysql - 在 MySQL 中应用替换表
- c# - Excel VSTO 模板 PowerQuery
- android - 是否可以在锁屏上添加第二个正确答案?
- c# - WorksheetCollection 设置范围
- spring - 如何使用 Spring WebClient 编译来自多个请求的答案
- android - ViewPager Fragment 已添加到 DialogFragment
- exception - RISCV 矢量陷阱处理:CAUSE = 0 时的歧义
- python-3.x - 如何在实时/运行脚本之间传递变量?
- sceneform - 在 android studio 中使用 sceneform SDK,在不受支持的设备上创建 3d 查看器活动