在这个article中,如果您运行rake db:migrate
而不是rake db:schema:load
,我不明白会出现什么问题。作者说这是
因为您的第一次迁移“create_posts”是必要的 你已经在Post中定义了可翻译的属性:title和:text 模型,但你删除了:帖子模型翻译的标题。
但是为什么你需要“定义可翻译属性:标题和:Post模型中的文本”?如果您只是在运行迁移,那么它与模型文件有什么关系?迁移和db不会检查您的模型文件是否有任何问题?运行rake db:migrate
只需查看仅您的迁移,并将这些rails方法转换为SQL命令,为您构建一个新数据库,然后为您生成一个新的schema.rb
文件对?为什么模型中的内容很重要?
答案 0 :(得分:1)
但是为什么有必要让#34;定义可翻译属性:标题和:文章在Post模型中#34;?如果您只是在运行迁移,那么这与模型文件有什么关系呢?
首先,迁移文件只是一个ruby文件。你可以在里面写任何代码:
迁移文件中的代码类型:
通常他们是迁移方法,例如create_table
或add_column
。
create_table
运行rake db:migrate
迁移文件,您会发现它成功而没有错误。有时,它们强烈耦合/依赖于当前模型文件的内容(或者实际上可能依赖于aaaany代码)。这些不是默认的Rails迁移方法,通常是您的一个或多个 gems 的API方法,甚至是您自己的代码实现(如果有的话)。在您的示例中,查看article,我注意到了非Rails迁移方法:
class CreatePosts < ActiveRecord::Migration
def up
create_table :posts do |t|
t.timestamps
end
# this is not a Rails migration method
Post.create_translation_table! title: :string, text: :text
end
end
对于Post.creation_translation_table!
我认为是 globalize gem中的方法,因为它不是Rails迁移方法,我们无法确定该代码是否依赖于& #34;东西&#34;从您当前的代码。我可以假设上面的命令就是这样,因为文章说
你会得到大错误!
这就是为什么文章说从新数据库迁移时使用rake db:schema:load
而不是rake db:migrate
的原因:
rake db:migrate
在每个迁移文件中运行 WHATEVER 所有代码虽然rake db:schema:load
只运行一个文件,而schema.rb
只是普通的数据库信息,并且没有可能会破坏/引发错误的外来代码。
虽然......我实际上可能会更新&#34; BROKEN&#34;迁移文件只是为了使rake db:migrate
正常运行,前提是我确定迁移错误是从非Rails方法的行跟踪的,这些方法取决于我的代码的特定版本。