【问题标题】:Wrong class types used in sql when STI used with join query当 STI 与连接查询一起使用时,sql 中使用了错误的类类型
【发布时间】: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_sqlIdentity.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


【解决方案1】:

升级到 Rails 4.2.11 后,问题消失了。 我将付出更多努力在旧版本上重现此行为,并在必要时向 Rails 团队报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多