Заполнение таблицы значениями во время миграции работает не полностью

#ruby-on-rails #migration

#ruby-on-rails #миграция

Вопрос:

Поскольку моя таблица Users довольно большая, я решил перенести информацию о профиле пользователя в отдельную таблицу: Profiles. Таким образом, у таблицы пользователей будет только информация о доступе (с использованием Devise gem). У профиля может быть много пользовательских обращений.

Для этого я создал файл миграции для записи новых данных в таблицу Profiles из таблицы Users:

 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

В приложении реальный пользователь (определенный информацией в таблице Profiles) может получить доступ к приложению, используя множество электронных писем (личных, профессиональных, …). В этом случае модели выглядят следующим образом:

 class User < ActiveRecord::Base
  belongs_to :profile
end

class Profile < ActiveRecord::Base
  has_many :users
end
  

Вот почему в таблице Users есть profile_id (атрибут, который не обновляется во время миграции ??)

Комментарии:

1. можно было бы сделать puts profile. идентификатор внутри условия if?

Ответ №1:

Я думаю, вам следует использовать user_id not 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

Комментарии:

1. Спасибо за ваш ответ @itsnikolay. На самом деле: Пользователь has_one :profile и профиль has_many :users . Таким образом, уникальный пользователь (определенный его профилем) может получить доступ к своей учетной записи, используя множество адресов электронной почты (расположенных в таблице Users). Вот почему таблица Users имеет атрибут profile_id. Я обновлю вопрос.

2.Вероятно, вам следует использовать has_and_belongs_to_many_association или has_many ... :trough guides.rubyonrails.org /…