gpt4 book ai didi

mysql - 带有命名空间的模型 - 错误的表名(没有命名空间)

转载 作者:行者123 更新时间:2023-11-29 06:27:44 24 4
gpt4 key购买 nike

我在一个遗留应用程序(过时的 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 有点“解决”了这个问题,但我认为这也不是好的解决方案。

我的问题是您是否知道真正导致此问题的原因以及如何在不重新加载类缓存的情况下解决它?

最佳答案

如您所见,假定的表名没有考虑模块。

但是正如您已经知道的那样,您可以自己设置它,使用:

self.table_name = 'great_items'

根据 this doc ,因为你用的是3.0.x,所以你要用:

set_table_name "great_items"

这必须放在类定义之上

关于mysql - 带有命名空间的模型 - 错误的表名(没有命名空间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29936488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com