ruby-on-rails - 单表继承查找问题

标签 ruby-on-rails ruby inheritance

我有以下 3 个 rails 类,它们都存储在一个表中,使用 rails 的单表继承。

class Template < ActiveRecord::Base
class ThingTemplate < Template
class StockThingTemplate < ThingTemplate

如果我有一个 ID 为 150StockThingTemplate,那么逻辑上我应该能够这样做:

ThingTemplate.find(150)
=> #returns me the StockThingTemplate

事实上,这有效,有时

当它工作时,它会生成以下 SQL 查询:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) )

当它不起作用时,它会生成以下 SQL 查询:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') )

SQL 正在执行它应该执行的操作,但问题是,为什么它一次生成一组 SQL,而另一次生成一组不同的 SQL。它实际上是完全相同的代码。

注意事项:

  • 我在 Rails 1.2 上
  • 我已经在多个地方尝试过require 'stock_thing_template'。要么没有效果,要么导致其他问题

最佳答案

好的。原来这是因为 rails 并不总是看到整个继承层次结构。由于它会根据每个请求重新加载所有项目,这解释了不一致的行为(在某些地方,before_filter 可能导致模型加载,而在其他地方可能不会)。

可以通过放置来修复

require_dependency 'stock_thing_template'

在我所有引用这些东西的 Controller 的顶部。

More info on the rails wiki - 转到页面底部

关于ruby-on-rails - 单表继承查找问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220584/

相关文章:

ruby-on-rails - Rails 中的可滚动 PDF - ActiveStorage

ruby - 将语素数组转换为 Ruby 中的句子

ruby-on-rails - 发送 1 个附件,收件人报告 2 个附件(已添加 ATT0001.c) - Rails 3、ActionMailer

javascript - 如何使用 i18n 值将 coffeescript 中的字符串国际化?

javascript - 在 Rails 中找不到 Bootstrap

ruby-on-rails - 电子邮件验证错误在 obj.errors.full_messages 中出现两次(Rails 3.2、Devise、RSpec)

ruby - 不匹配两个下划线的正则表达式

inheritance - protobuf-net 序列化为基类

c# - 如何在父类中调用 EventHandler

C# 和继承。对象为扩展类对象时基类属性为null