Ruby on Rails add_column не добавляет этот столбец в существующие строки - PullRequest
0 голосов
/ 27 июля 2010

Я создал эту миграцию в Rails:

class AddSocialSecurityNumberToContactTable < ActiveRecord::Migration
  def self.up
    add_column :contacts, :ss_number, :string
  end

  def self.down
    remove_column :contacts, :ss_number
  end
end

В моей базе данных разработки, которая является базой данных SQLite3, все старые записи контактов получили поле ss_number, просто ноль. Однако всякий раз, когда я развертываю код с миграциями, старые записи контактов перед миграцией не имеют поля ss_number. Я перезапустил сервер и вошел в консоль и проверил это обоими способами как на рабочей базе данных (MySQL), так и на промежуточной базе данных (MySQL).

Если, однако, я создаю новую запись в консоли, она отображает поле ss_number для объекта Contact.

>> a = Contact.find(1)
=> #<Contact id: 1, first_name: "Gary", last_name: "Simpson", email: "", home_phone: "", work_phone: "", mobile_phone: "", mailing_street: "123 Main St", mailing_street_2: "", mailing_city: "Little Rock", mailing_state: "AR", mailing_zip: "72205", created_by: 1, created_at: "2010-07-24 19:30:10", updated_at: "2010-07-24 19:30:10">
>> a.ss_number
ActiveRecord::MissingAttributeError: missing attribute: ss_number
 from /srv/www/domain/releases/20100727004056/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:217:in `send'
 from /srv/www/domain/releases/20100727004056/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:217:in `method_missing'
 from (irb):4
>> a = Contact.new
=> #<Contact id: nil, first_name: nil, last_name: nil, email: nil, home_phone: nil, work_phone: nil, mobile_phone: nil, mailing_street: nil, mailing_street_2: nil, mailing_city: nil, mailing_state: nil, mailing_zip: nil, created_by: nil, created_at: nil, updated_at: nil, ss_number: nil>
>> a.ss_number
=> nil

Как я могу сделать так, чтобы все существующие строки Контакта имели nil в качестве значения после миграции?

1 Ответ

1 голос
/ 27 июля 2010

Вы можете добавить Поиск кодов и блоков в свой код миграции, чтобы вы могли сделать что-то вроде этого:

  def self.up
    add_column :contacts, :ss_number, :string
    Contacts.find(:all).each do |contact|
      contact.ss_number = nil
      contact.save
    end
  end

Надеюсь, это поможет!

В качестве альтернативы, я полагаю, вы могли бы просто сделать это:

add_column :contacts, :ss_number, :string, :null=>true

: нуль => верно

в конце установит его по умолчанию, так как он добавляет столбец в таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...