Rails 3 - Что не так с этой миграцией? - PullRequest
0 голосов
/ 08 декабря 2010

У меня запущено приложение. Я хочу создать миграцию UserNotifications, которая принадлежит пользователю. Но миграция продолжает давать ошибки.

class CreateUserNotifications < ActiveRecord::Migration
  def self.up
    create_table :user_notifications do |t|
      t.integer :user_id
      t.boolean :notify_news, :default => true
      t.boolean :notify_research, :default => true
      t.timestamps

    end

    # Ensure Existing users have a notification setting
    User.all.each do |u|
      UserNotification.create_by_user_id(u.id)
      user.save
    end

add_index :user_notifications, :user_id
  end

  def self.down
    drop_table :user_notifications
  end
end

Чтобы убедиться, что я прошу четкий вопрос, вот информация о модели:

class User < ActiveRecord::Base
  has_one :user_notification, :dependent => :destroy

class UserNotification < ActiveRecord::Base  
  belongs_to :user

ОШИБКА:

$ rake db:migrate
(in /Users/bhellman/Sites/cline)
==  CreateUserNotifications: migrating ========================================
-- create_table(:user_notifications)
NOTICE:  CREATE TABLE will create implicit sequence "user_notifications_id_seq" for serial column "user_notifications.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "user_notifications_pkey" for table "user_notifications"
   -> 0.2942s
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `create_by_user_id' for UserNotification(Table doesn't exist):Class

Спасибо, что заглянули

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Ваш код self.up выполняется в транзакции базы данных. Поэтому, когда вы пытаетесь запустить свои методы создания, новая таблица еще не существует официально. Вы можете переместить его в отдельную миграцию, но есть гораздо лучший способ.

Чтобы сделать это, вы должны создать задачу rake и полностью исключить ее из миграции. Я написал в блоге об этом:

Добавление столбцов и данных по умолчанию к существующим моделям

В разделе «Более сложные значения по умолчанию» приводятся причины, по которым вы не должны помещать подобный код в миграцию. Основная причина в том, что миграции со временем «гниют» - при изменении базы кода старые миграции перестают работать.

Если у вас есть какие-либо вопросы, дайте мне знать. Надеюсь, это поможет!

1 голос
/ 08 декабря 2010

Попробуйте это

User.all.each do |u|
  UserNotification.create(:user_id => u.id)
end

Ошибка может быть связана с тем, что рельсы схемы БД ссылаются на устаревшие (и, следовательно, не реагирующие на динамические методы).Вы также можете попробовать

UserNotification.reset_column_information

перед использованием create_by_user_id (то есть над блоком)

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