【问题标题】:Rails can't find database column just createdRails 找不到刚刚创建的数据库列
【发布时间】:2013-05-03 08:24:25
【问题描述】:

我刚刚运行迁移以将:new_column 添加到:my_table这是一个序列化的列(整个项目中的第一个),所以我已经将配置添加到模型中:

serialize :new_column, Array

我的迁移如下:

add_column :my_table, :new_column, :text

之后,我运行了rake db:reset,以便播种新数据,并签入rails console,以确保数据正确添加到我的:new_column。这一切都在那里。

到目前为止一切顺利,但是...在rails server 中,我的应用程序将简单地因错误而停止:

ActiveModel::MissingAttributeError in TestController#index
missing attribute: new_column

好吧,我只知道我的控制器正在尝试访问@my_table_model.new_column。我还检查了schema.db,那里一切都很好。

可能是什么原因造成的?

【问题讨论】:

  • 您是否在 Rails 控制台和 Rails 服务器的开发环境(而不是测试或生产环境)中操作?如果您的测试数据库与开发数据库不同,您是否将更改应用到两个数据库?
  • 是的...我只在开发中运行。查看来自控制台的消息:Loading development environment (Rails 3.2.9);和来自服务器的消息:=> Rails 3.2.9 application starting in development on http://0.0.0.0:3000。控制台访问数据和服务器停止ActiveModel::MissingAttributeError :S
  • 您在应用迁移后重新启动了 Rails 服务器?
  • 当然...感谢您的帮助。但我使用同一个终端来移动迁移、控制台和服务器。所以我必须关闭一个才能去另一个......而且我已经做过很多次了!也许有一个特定的程序可以“真正”重置我不知道的服务器?
  • 没有。我以为你会重新启动,但这是我能想到的唯一其他事情。我很茫然,但下一个看到这个的人不必问:)

标签: ruby-on-rails database serialization


【解决方案1】:

解决了!这是一个Rails.cache 问题。

确实正在填充数据库,但是缓存了先前模式中的某些属性,并且当控制器尝试访问时,正在返回先前的对象(没有:new_column_field 的对象)。所以最终的解决方案非常简单:

  Rails.cache.clear

感谢WhitSunxperous 帮助我。 :)

【讨论】:

    【解决方案2】:

    还要确保您没有使用数据库架构缓存转储“功能”。

    例如,对于许多 pod/server/unicorns/workers/threads 访问同一个数据库的非常大的部署,创建模式转储可能很有用:

    RAILS_ENV=$RAILS_ENV bundle exec rake db:schema:cache:dump
    

    这有助于减少部署期间对数据库的访问,从而提高性能。

    但是您必须确保在所有迁移完成后启动新的 pod/服务器,如果没有,则架构缓存包含对数据库的旧引用。

    更多详情:https://kirshatrov.com/2016/12/13/schema-cache/

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 2016-05-11
      • 2018-03-09
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多