我有一个应用正在运行。我想创建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
谢谢你看看
答案 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
“更复杂的默认值”部分解释了您不应该在迁移中放置此类代码的原因。主要原因是随着时间的推移迁移“腐烂” - 随着代码库的变化,旧的迁移将停止工作。
如果您有任何疑问,请与我们联系。我希望这有帮助!