2017-01-28 11 views
1

Я пытаюсь засеять мою базу данных некоторыми поддельными данными. Я хочу, чтобы каждый Проспект принадлежал одному пользователю. Мое семя создает пользователей, но не создает Перспективы, и я не знаю, почему.Rails сеялка с has_one сбой

User.destroy_all 
Prospect.destroy_all 

50.times do 

    u = User.new 
    u.email = Faker::Internet.email 
    u.password = "password" 
    u.first_name = Faker::Name.first_name 
    u.last_name = Faker::Name.last_name 
    u.save 

end 

users = User.all 
puts users 

users.each do |user| 
    p = Prospect.new 
    p.id = user.id 
    p.parent_first_name = user.first_name 
    p.parent_last_name = user.last_name 
    p.student_first_name = Faker::Name.first_name 
    p.save 
end 

Вот мои модели Проспект пользователя и

# prospect.rb 
class Prospect < ApplicationRecord 
    belongs_to :user 

    def full_parent_name 
    name = "#{parent_first_name.capitalize} #{parent_last_name.capitalize}" 
    end 

end 

# user.rb 
class User < ApplicationRecord 
    has_one :prospect 

... lots of devise and Oauth stuff 
end 

Мой путы утверждение показывает, что User.all находит 50 пользователей, так что я думаю, что моя проблема пытается создать belongs_to и has_one проблема , Должен ли я обращаться с этим по-другому?

ответ

2

Это выглядит не так:

p.id = user.id 

Вы не хотите, чтобы ваш продукт, чтобы иметь тот же идентификатор, как ваш пользователь. Вы можете написать

p.user = user 

все же.

Альтернативы:

Вместо

p = Prospect.new 
    p.user = user 
    p.parent_first_name = user.first_name 
    p.parent_last_name = user.last_name 
    p.student_first_name = Faker::Name.first_name 
    p.save 

вы могли бы просто написать:

user.create_prospect(student_first_name: Faker::Name.first_name) 

Поскольку ваш проспект принадлежит пользователю, он не должен занимать ту же информацию в базе данных на пользователя. Вы можете использовать delegate или определить parent_first_name как user.first_name, не записывая его в БД.

+0

Спасибо. Это была моя проблема. – aisflat439