【发布时间】:2015-04-29 07:01:52
【问题描述】:
我在一个遗留应用程序(过时的 rails-3.0.20)中发现了一个问题。 这个应用程序有很多组件和嵌套模型。问题仅存在于其中一台生产服务器上(与其他生产和我的开发环境相同的环境)。
有一个名称空间看起来像的模型
module Great
class Item
end
end
表名被命名为great_items。
当我在出现故障的服务器上调试/打开它时,我发现计算出的表名是 items 而不是 great_items。
$ Great::Item.all
#=> ActiveRecord::StatementInvalid: No attribute named `name` exists for table `items`
所以我认为 mby 存在具有相同命名空间的类似类,我已经检查过它并没有。我的第二个想法是明确设置表名我试过
self.table_name = 'great_items'
# &
set_table_name 'great_items'
在此更改之后,我运行 rails c 并且表名设置得很好:
$ Great::Item.table_name
#=> 'great_items'
但是当我尝试获取一些物品时,出现了一个奇怪的错误,我到现在都无法理解!
$ Great::Item.all
#=> ActiveRecord::StatementInvalid: Mysql2::Error: Table 'db.items' doesn't exist: SELECT `great_items`.* FROM `items` WHERE `great_items`.`some_default_scope` = 0
正如您在上面的示例表中看到的,select 值和 where 语句中的名称正确,但 from 中的值不正确。
我很好奇所以我检查了ActiveRecord::Base mysql 适配器并且有某种捕获表名所以我尝试reset_table_name。重置有助于设置预期的名称('great_items'),但没有错过上述错误。
当我在生产环境中上课时,问题消失了 - 但这不是解决方案。
最后我在set_table_name 之后使用reset_column_information '解决'了这个问题,但我认为这也不是好的解决方案。
我的问题是,您知道真正导致此问题的原因以及如何在不重新加载类缓存的情况下解决它吗?
【问题讨论】:
-
没有。但我现在检查了一下,结果并不令人满意:
irb(main):001:0> Great::Item.table_name_prefix => "great_" irb(main):002:0> Great::Item.table_name => "items"
标签: mysql ruby-on-rails ruby ruby-on-rails-3