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