Ruby on Rails:如何迁移对模型所做的更改?

s8vozzvw  于 2023-05-28  发布在  Ruby
关注(0)|答案(3)|浏览(127)

在Rails应用程序中,如何迁移在模型中所做的更改?
例如,我知道如果我用命令rails g model Person name:string创建一个模型,也会创建一个迁移。但是,如果在这一步之后,我转到创建的模型Person并添加一个新属性,这个新属性是否会自动添加到迁移中,以便稍后在数据库中持久化?
或者我从错误的Angular 看待这个问题,应该将属性添加到迁移中,然后再添加到模型中?

cigdeys3

cigdeys31#

实际上,您不能向模型“添加”属性,您可以通过创建迁移文件并运行它来实现这一点-- Rails根据数据库中的列来确定模型具有哪些属性。但是,如果您希望能够通过批量赋值更新属性,则需要向模型添加一行以将属性列入白名单。这就是为什么你经常会在ActiveRecord模型中看到这样一行代码:

attr_accessible :name

但这是可选的,对于添加属性来说不是必需的。
要将新属性实际添加到模型中,请首先使用以下命令创建迁移:

rails g migration AddAddressToPerson address:string

这将在db/migration/目录中创建迁移文件。(形式“AddXXXToYYY”和“RemoveXXXFromYYY”被rails理解为“向模型XXX添加(或删除)新列”,有关详细信息,请参阅documentation)。在本例中,我添加了一个名为address的属性,它是一个字符串,但您可以将其更改为您想要的任何内容。
然后,要真正更新数据库,需要使用rake运行迁移:

rake db:migrate

最后,如果您希望允许对该属性进行批量赋值,请将该属性添加到attr_accessible的参数列表中:

attr_accessible :name, :address

应该可以了

bd1hkmkf

bd1hkmkf2#

如果使用attr_accessor添加新属性,则不需要执行任何迁移操作,但更改不会存储在数据库中。
如果您确实希望持久化更改,则需要使用migration将属性添加到模型中。你可以创建一个文本文件,使用适当的结构,迁移并不复杂,但是在像这样的rails generate migration AddLastNameFieldToUsers上生成它要容易得多。这样一个文件的内容可以调整为如下所示:

class AddLastNameFieldToUsers< ActiveRecord::Migration
  def change
    add_column :users, :last_name, :string
  end
end
6l7fqoea

6l7fqoea3#

您不需要直接向模型添加属性。Rails(实际上是ActiveRecord)会自动推断它。对于模型类的属性列表,AR查找模型名称为复数形式的表(如果model为Order,则它将在orders表中查找属性)。它是被称为CoC - Convention over Configuration的设计特征的一部分。
因此,如果您必须添加一个属性,则必须创建一个迁移,以便将该字段添加到列中,如其他答案中所述。

相关问题