首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖默认STI行为

覆盖默认STI行为
EN

Stack Overflow用户
提问于 2015-10-07 22:58:13
回答 1查看 38关注 0票数 0

我有一个STI设置配置文件。配置文件可以是用户,也可以是页面,但是有许多类型的用户和配置文件。例如:

代码语言:javascript
复制
profile
  -user
    --member
    --admin
    --moderator
  -page
    --business
    --event
    --band

当我试图运行查询时

代码语言:javascript
复制
Profile::User.find_by_email(params[:email])

生成的SQL。

代码语言:javascript
复制
SELECT  "profiles".* FROM "profiles" WHERE "profiles"."type" IN ('Profile::User') AND "profiles"."email" = 'email@email.com' LIMIT 1

因为有不同类型的用户,所以这个查询不能工作。

是否可以覆盖默认的'IN‘行为,而不是搜索基本配置文件::User,我可以包含不同类型的用户?换句话说,我想要生成

代码语言:javascript
复制
 SELECT  "profiles".* FROM "profiles" WHERE "profiles"."type" IN ('Profile::User::Member', 'Profile::User::Admin', 'Profile::User::Moderator') AND "profiles"."email" = 'email@email.com' LIMIT 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 23:23:56

事实上,这是一个非常频繁的问题,以至于在指南中有一个单独的部分。

问题在于常量自动加载。它查询它目前所知道的User的所有后代。当类被紧急加载时,执行工作(例如在production环境中)。否则,仅在引用类的地方查找和加载类。你永远不会在父母中引用孩子,因此他们不会被载入,并且不会在后代列表中结束。

指南中的部分提出了一个解决方案:要求在带有基类的文件中使用require_dependency ( STI层次结构的根)来要求层次结构的“底部”。因为,事实证明,父类确实需要了解其子类才能找到它们。

只有属于的叶子(至少是孙辈)才需要这样加载。直接子类不需要预加载。如果层次结构更深,中间类将从底部递归地自动加载,因为它们的常量将以超类的形式出现在类定义中。

也就是说,自动加载很容易处理层次结构中的“向上”,但不能“向下”。通过在“底部”加载所有类,自动加载可以递归地跟踪它们的父类,并发现其他类。

指南声称这种行为不是一个bug。但是,这当然是一种反常现象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33003830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档