首页 > 解决方案 > 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 会做出这种影响我输出的奇怪行为?

标签: ruby-on-railsrubysti

解决方案


实际上我没有重现描述中的不一致行为(两个User::Donor.first打印不同的结果)。在您的 rails 控制台会话期间,您的文件或数据库是否被修改?

如果你的意思是User::Donor查询时得到结果User::Legal很奇怪,答案是:这是预期的行为,这就是为什么它被称为“继承”。

这个概念来自面向对象编程,意思是“是一个”。在这里,您User::Legal继承自User::DonorUser::Legala 也是如此User::Donor。查询User::Donor记录时,User::Legal也应出示。

请参阅 rails 文档中的“单表继承”:https ://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html


推荐阅读