在 Rails 应用程序中,如何迁移我在模型中所做的更改?例如,我知道如果我使用命令“rails g model Person name:string”创建模型,也会创建迁移。但是,如果在这一步之后我转到创建的模型“Person”并添加一个新属性,这个新属性是否会自动添加到迁移中以便以后在数据库中持久化?还是我从错误的角度看待这个问题,应该将属性添加到迁移中,然后添加到模型中?
问候
在 Rails 应用程序中,如何迁移我在模型中所做的更改?例如,我知道如果我使用命令“rails g model Person name:string”创建模型,也会创建迁移。但是,如果在这一步之后我转到创建的模型“Person”并添加一个新属性,这个新属性是否会自动添加到迁移中以便以后在数据库中持久化?还是我从错误的角度看待这个问题,应该将属性添加到迁移中,然后添加到模型中?
问候
您不能真正为模型“添加”属性,您可以通过创建迁移文件并运行它来做到这一点——Rails 根据数据库中的列来计算模型具有哪些属性。但是,如果您希望能够通过批量分配对其进行更新,则确实需要在模型中添加一行以将该属性列入白名单。这就是为什么你会经常在 activerecord 模型中看到这样的一行:
attr_accessible :name
但这是可选的,对于添加属性不是必需的。
要将新属性实际添加到模型中,首先使用以下命令创建迁移:
rails g migration AddAddressToPerson address:string
这将在 db/migration/ 目录中创建迁移文件。(rails 将“AddXXXToYYY”和“RemoveXXXFromYYY”的形式理解为“向模型 XXX 添加(或删除)新列”,详见文档)。在这种情况下,我添加了一个名为的属性address
,它是一个字符串,但您可以将其更改为您想要的任何内容。
然后要实际更新数据库,您需要使用以下命令运行迁移rake
:
rake db:migrate
最后,如果您想允许对该属性进行批量分配,请将属性添加到您的参数列表中attr_accessible
:
attr_accessible :name, :address
那应该这样做。
如果您使用attr_accessor添加新属性,则无需对迁移执行任何操作,但您的更改不会存储在数据库中。
如果您确实想保留更改,则需要使用迁移将属性添加到模型中。您可以只创建一个具有适当结构的文本文件,迁移并不花哨,但是像这样生成要容易得多rails generate migration AddLastNameFieldToUsers
。此类文件的内容可能会调整为如下所示:
class AddLastNameFieldToUsers< ActiveRecord::Migration
def change
add_column :users, :last_name, :string
end
end
您不需要直接向模型添加属性。Rails(实际上是 ActiveRecord)会自动推断它。对于模型类的属性列表,AR 会查找模型名称的复数形式的表(如果模型是 Order,那么它将在 orders 表中查找属性)。它是称为 CoC - 约定优于配置的设计功能的一部分。
因此,如果您必须添加属性,则必须创建迁移以将该字段添加到列中,如其他答案中所述。