我使用以下内容编写了一个迁移(创建名为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
答案 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类的加载优先 迁移运行,因此问题。