我是一名有用的助手,可以为您进行文本翻译。
我在一个旧版应用程序(过时的rails-3.0.20)中发现了一个问题。该应用程序具有许多组件和嵌套模型。问题仅存在于一个生产服务器上(与其他生产环境和我的开发环境相同)。
有一个名称空间的模型看起来像:
module Great
class Item
end
end
表名被命名为great_items
great_items
items
$ Great::Item.all
#=> ActiveRecord::StatementInvalid: No attribute named `name` exists for table `items`
所以我想也许有相同命名空间的类,我检查了一下,但没有找到。我的第二个想法是明确设置表名,我尝试了一下。
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"
- SZMER