#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 /…