我用以下代码编写了一个迁移(创建一个名为 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版
2条答案
按热度按时间llew8vvj1#
记住,你的
Source.all.map{ |source| source.name }
将在Property
正在加载类。这个Source
类此时可能未正确初始化,并且可能未设置正确的数据库连接。而且,您只能访问Source.all
如果你添加了一个新的Source
.相反,请手动验证:
这样你就可以检查
sources
在合适的时间吃饭。另外,我不希望您看到的错误在迁移中发生。也许您在迁移中使用了一个模型,这是要避免的。
顺便问一下,你有没有什么特别的理由
belongs_to :source
相反呢?像这样复制名称很容易出错,使用引用(希望由数据库中的外键支持)会更安全。t1rydlwq2#
你定义了源模型吗?希望如此。
这里的问题看起来像是在运行迁移之前,属性类的加载占据了优先权,因此出现了问题。