我有一个STI设置配置文件。配置文件可以是用户,也可以是页面,但是有许多类型的用户和配置文件。例如:
profile
-user
--member
--admin
--moderator
-page
--business
--event
--band当我试图运行查询时
Profile::User.find_by_email(params[:email])生成的SQL。
SELECT "profiles".* FROM "profiles" WHERE "profiles"."type" IN ('Profile::User') AND "profiles"."email" = 'email@email.com' LIMIT 1因为有不同类型的用户,所以这个查询不能工作。
是否可以覆盖默认的'IN‘行为,而不是搜索基本配置文件::User,我可以包含不同类型的用户?换句话说,我想要生成
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发布于 2015-10-07 23:23:56
事实上,这是一个非常频繁的问题,以至于在指南中有一个单独的部分。。
问题在于常量自动加载。它查询它目前所知道的User的所有后代。当类被紧急加载时,执行工作(例如在production环境中)。否则,仅在引用类的地方查找和加载类。你永远不会在父母中引用孩子,因此他们不会被载入,并且不会在后代列表中结束。
指南中的部分提出了一个解决方案:要求在带有基类的文件中使用require_dependency ( STI层次结构的根)来要求层次结构的“底部”。因为,事实证明,父类确实需要了解其子类才能找到它们。
只有属于的叶子(至少是孙辈)才需要这样加载。直接子类不需要预加载。如果层次结构更深,中间类将从底部递归地自动加载,因为它们的常量将以超类的形式出现在类定义中。
也就是说,自动加载很容易处理层次结构中的“向上”,但不能“向下”。通过在“底部”加载所有类,自动加载可以递归地跟踪它们的父类,并发现其他类。
指南声称这种行为不是一个bug。但是,这当然是一种反常现象。
https://stackoverflow.com/questions/33003830
复制相似问题