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