Ruby on Rails:如何迁移模型上的更改?

时间:2012-10-17 23:29:06

标签: ruby-on-rails ruby ruby-on-rails-3 rails-migrations rails-models

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

此致

3 个答案:

答案 0 :(得分:11)

您无法真正向模型“添加”属性,您可以通过创建迁移文件并运行它来实现--Rails根据数据库中的列来确定模型的属性。但是,如果您希望能够通过批量分配更新属性,则执行需要在模型中添加一行以将属性列入白名单。这就是为什么你经常在activerecord模型中看到这样的一行:

attr_accessible :name

但这是可选的,而不是添加属性所必需的。

要将新属性实际添加到模型中,请首先使用以下命令创建迁移:

rails g migration AddAddressToPerson address:string

这将在db / migration /目录中创建迁移文件。 (rails表示“AddXXXToYYY”和“RemoveXXXFromYYY”形式表示“向模型XXX添加(或删除)新列”,详情请参阅documentation)。在这种情况下,我添加了一个名为address的属性,这是一个字符串,但您可以将其更改为您想要的属性。

然后要实际更新数据库,您需要使用rake

运行迁移
rake db:migrate

最后,如果您想允许对该属性进行质量分配,请将该属性添加到attr_accessible的参数列表中:

attr_accessible :name, :address

应该这样做。

答案 1 :(得分:2)

如果要使用attr_accessor添加新属性,则无需对迁移执行任何操作,但您的更改不会存储在数据库中。

如果您确实希望保留更改,则需要使用migration将属性添加到模型中。您可以创建一个文本文件,使用适当的结构,迁移不是什么花哨,但是像rails generate migration AddLastNameFieldToUsers这样生成起来要容易得多。可能会调整此类文件的内容,如下所示:

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

答案 2 :(得分:0)

您无需直接向模型添加属性。 Rails(实际上是ActiveRecord)会自动推断它。对于模型类的属性列表,AR查找具有模型名称的复数形式的表(如果模型是Order,则它将在orders表中查找属性)。它是名为CoC - Convention over Configuration。的设计功能的一部分。

因此,如果必须添加属性,则必须创建迁移以将该字段添加到列中,如其他答案中所述。