Нормализация данных в рельсах - PullRequest
3 голосов
/ 13 апреля 2010

Я создал модель рельсов, выполнив

script/generate model Customer name:string address:string city:string state:string zip:integer [...]

Я заполнил базу данных 5000 клиентами и начал создавать свое приложение. Теперь я понял, что моя модель не нормализована: у меня часто несколько клиентов по одному адресу! Если я хочу сделать что-то по адресу, например, рассылку, это вызывает проблемы. То, что я хотел бы иметь, это модель Address, модель Customer и модель Mailing.

Есть ли способ рельсов для нормализации существующей модели, разделив ее на две модели? Или мне просто написать скрипт для нормализации моих существующих данных, а затем сгенерировать новые модели соответственно?

Ответы [ 2 ]

9 голосов
/ 13 апреля 2010

Вы спрашивали о том, как будет выглядеть миграция. Вместо того, чтобы втиснуть это в комментарий, я создал для вас новый ответ.

script/generate model address customer_id:integer address:string city:string state:string zip:integer

class CreateAddresses < ActiveRecord::Migration
  def self.up
    create_table :addresses do |t|
      t.integer :customer_id
      t.string :address
      t.string :city
      t.string :state
      t.integer :zip_code
      t.timestamps
    end

    # move customer address fields to address table
    Customer.all.each do |c|
      Address.create({
        :customer_id => c.id,
        :address => c.address,
        :city => c.city,
        :state => c.state,
        :zip => c.zip
      })
    end

    # you'll have to write your own merge script here
    # use execute("your sql goes here...") if you can't do it with ActiveRecord methods

    # remove old customer address columns
    remove_columns(:customers, :address, :city, :state, :zip)

  end

  def self.down

    # here you will define the reverse of the self.up method

    # re-add the address columns to the user table

    # repopulate the customer table with data from the address table

    drop_table :addresses
  end
end

Ресурсы

  1. AcitveRecord :: Migration
  2. выполнить
4 голосов
/ 13 апреля 2010

Мне неизвестен встроенный в Rails способ программного разделения вашей модели. Вам нужно будет написать новую модель Address и миграцию обновлений базы данных, чтобы все переключилось.

Ваши модели будут выглядеть примерно так:

class Person < ActiveRecord::Base
  has_many :addresses
end

class Address < ActiveRecord::Base
  belongs_to :person
end
...