Rails Mysql2 ::错误表不存在创建新迁移时

时间:2018-04-12 02:22:03

标签: mysql ruby-on-rails database ruby-on-rails-4 migration

我使用以下内容编写了一个迁移(创建名为sources的新表):

class CreateSources < ActiveRecord::Migration
  def change
    create_table :sources do |t|
      t.string :name, null: false, default: ""

      t.timestamps null: false
    end
  end
end

然后我修改了我现有的模型:

class Property < ActiveRecord::Base
  validates :source, allow_blank: true, inclusion: { in: 
  Source.all.map{ |source| source.name } }

我想在属性的源代码中添加验证,只允许来自sources表的源。

然后当我运行迁移时,我收到以下错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'sources' doesn't exist: SELECT `sources`.* FROM `sources`

问题是源表的查询尚未初始化时发生 关于如何让迁移运行的任何提示? 这是在生产级别上运行的。所以我可能无法删除所有迁移并重新排列它。

Rails版本4.2.5
SQL版本5.7

2 个答案:

答案 0 :(得分:1)

请记住,在加载Source.all.map{ |source| source.name }类时将执行Property。此时Source类可能未正确初始化,并且可能没有正确的数据库连接设置。此外,您只能访问Source.all一次,因此如果您添加了新的Source,则必须重新启动应用。

相反,手动验证:

class Property < ActiveRecord::Base
  validate :valid_source
private
  def valid_source
    return if(source.blank?)
    return if(Source.where(name: source).exists?)
    errors.add(:source, 'Unknown source') # Or whatever you want to say
  end
end

这样你就可以在合适的时间检查sources表。

此外,我不希望您在迁移过程中看到错误。也许你在迁移中使用了一个模型,这是应该避免的。

顺便说一下,有没有特别的原因你没有belongs_to :source?像这样复制名称是非常容易出错的,使用引用(希望由数据库中的外键支持)会更安全。

答案 1 :(得分:0)

  

您是否定义了源模型?我希望如此。

     

这里的问题看起来像Property类的加载优先   迁移运行,因此问题。