【发布时间】:2019-11-03 09:41:25
【问题描述】:
我最近从 Rails 4.1.4 升级到 4.2.8,我的行为很奇怪。
所以我们有桌子
class Identity < ActiveRecord::Base 和从它继承的表 Doctor, Assistant, Substitute。
所以当我不在这些类中并调用(rails 控制台、规范)时
Doctor.all.to_sql =>
"SELECT \"identities\".* FROM \"identities\" WHERE \"identities\".\"type\" IN ('Doctor')" 这很好。
当我从助理模型中的类方法进行相同的调用时,它会产生以下
Doctor.all.to_sql =>
"SELECT \"identities\".* FROM \"identities\" WHERE \"identities\".\"type\" IN ('Assistant', 'Substitute')" 这是错误的。
当我在助手模型中的类方法中并做时
Doctor.unscoped.all => "SELECT \"identities\".* FROM \"identities\" WHERE \"identities\".\"type\" IN ('Doctor')" 很好的查询。
我检查了我们是否在某个地方设置了 default_scope,但我们没有。而且,当我这样做时,这很棘手
SomeTable.joins(:identities) 我无法取消identities 的范围,这导致我查询错误。
所以,我不太确定升级后发生了什么,但我知道它确实适用于旧的 Rails 4.1.4。
任何提示都会有所帮助。
问候
【问题讨论】:
-
“当我在里面时,例如助手”是什么意思?对
Doctor.all.to_sql的调用应该始终产生相同的SQL,因为您只是在调用Doctor模型上的一个方法。 -
确实如此,但事实并非如此。假设我们在 Assistant 模型上有类方法,当我在该方法中调用
Doctor.all.to_sql或Identity.all.to_sql时,它会给我带有类型(Assistant、Substitute)的 sql 查询。例如,当我使用 rails 控制台时,或者在规范中并执行相同的查询时,它应该没问题。 -
可能是某种 Rails 错误...您尝试升级到 4.2.x 吗?我认为4.1.4。是一个相当旧的版本。
-
没有 Rails 4.1.4 可以按预期工作,但 4.2.8 会做那些乱七八糟的事情:/
-
也许可以查看发行说明?我仍然不明白行为如何依赖于上下文......独立于 Doctor 上的任何方法被调用的位置,结果应该是相同的。我完全相信你不是......但对我来说这将是一个危险信号,也许尝试一个更新的版本?我觉得还有4.2.11?
标签: ruby-on-rails activerecord rails-activerecord ruby-on-rails-4.2 sti