rails mysql2::error表不存在

cl25kdpy  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(412)

我用以下代码编写了一个迁移(创建一个名为 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 table。
当我运行迁移时,出现了以下错误:

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

问题是源表的查询在尚未初始化时发生。
关于如何运行迁移有什么建议吗?
这是在生产层面上运行的。所以我可能不能放弃所有的迁移并重新安排它。
rails版本4.2.5
sql 5.7版

llew8vvj

llew8vvj1#

记住,你的 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 相反呢?像这样复制名称很容易出错,使用引用(希望由数据库中的外键支持)会更安全。

t1rydlwq

t1rydlwq2#

你定义了源模型吗?希望如此。
这里的问题看起来像是在运行迁移之前,属性类的加载占据了优先权,因此出现了问题。

相关问题