Rails 3 - 这次迁移有什么问题?

时间:2010-12-07 22:38:29

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

我有一个应用正在运行。我想创建belongs_to用户的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

为了确保我问清楚q,这是模型信息:

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 个答案:

答案 0 :(得分:1)

试试这个

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

错误可能是由于数据库模式rails指的是不是最新的(因此不响应动态方法)。您可能还想尝试

UserNotification.reset_column_information

在使用create_by_user_id之前(即在块上方)

答案 1 :(得分:1)

您的self.up代码正在数据库事务中运行。因此,当您尝试运行创建方法时,新表尚未正式存在。您可以将其移至单独的迁移,但有更好的方法。

您应该构建一个rake任务来执行此操作,并使其完全脱离迁移。我写了一篇关于此的博文:

Adding Columns and Default Data to Existing Models

“更复杂的默认值”部分解释了您不应该在迁移中放置此类代码的原因。主要原因是随着时间的推移迁移“腐烂” - 随着代码库的变化,旧的迁移将停止工作。

如果您有任何疑问,请与我们联系。我希望这有帮助!