在迁移期间使用值填充表不起作用

时间:2014-07-03 10:18:11

标签: ruby-on-rails migration

我的用户表非常大,我决定将用户个人资料信息迁移到单独的表格:个人资料。所以 Users 表只有访问信息(使用Devise gem)。 配置文件可以有很多用户访问。

为此,我在Users表中创建了一个迁移文件,用于在Profiles表中写入新数据:

class MigrateSomeUsersInfoToProfilesTable < ActiveRecord::Migration
  def up

    puts "Pulling out profile information from Users table. Can take a while..."
    puts "Start migrating #{User.count} users to `Profiles` table (#{Profile.count} profiles already created)..."

    User.all.each do |u|

      profile = Profile.new({
        first_name: u.first_name,
        last_name: u.last_name,
        picture: u.picture,
        zipcode: u.zipcode,
        bio: u.bio,
        address: u.address,
        latitude: u.latitude,
        longitude: u.longitude,
        gender: u.gender
      })

      if profile.save!
        u.profile_id = profile.id
        u.save!
      else
        puts "ERROR CREATING PROFILE FOR USER #ID #{u.id}"
      end

      puts "CREATED PROFILE ##{profile.id} FOR USER ##{u.id}"

    end
  end

  def down
    Profile.delete_all
  end
end

结果是创建了所有配置文件(与用户相同的数字)并正确填写。但是,profile_id对所有用户都是nil。这意味着行u.profile_id = profile.id未正确执行。

我收到的唯一日志消息是迁移文件中指定的消息(没有错误或警告消息)。

下面的代码中是否有我遗漏的内容?感谢。

更新

rails console我得到:

User.count
=> 2182

Profile.count
=> 2182

User.where("profile_id IS NULL").count
=> 2182

更新2

在应用程序中,真实用户(由“个人档案”表中的信息定义)可以使用许多电子邮件(个人,专业人士......)访问该应用程序。在这种情况下,模型如下:

class User < ActiveRecord::Base
  belongs_to :profile
end

class Profile < ActiveRecord::Base
  has_many :users
end

这就是为什么,Users表中有一个profile_id(在迁移期间没有更新的属性?)

1 个答案:

答案 0 :(得分:0)

如果您使用以下关联,我认为您应该使用user_id而不是profile_id

class Profile < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :profile
end

# tables
"profiles"
id: integer
user_id: integer

"users"
id: integer

http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association