Rails 播种循环 has_one 失败

Rails seeding loop with a has_one failing

我正在尝试用一些虚假数据为我的数据库做种。我希望每个潜在客户 belong_to 一个用户。我的种子创建了用户,但无法创建潜在客户,我不知道为什么。

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

我的 puts 语句显示 User.all 找到 50 个用户,所以我认为我的问题是试图创建 belongs_tohas_one 是问题所在。我应该以不同的方式处理吗?

这看起来不对:

  p.id = user.id

您不希望您的产品与您的用户具有相同的 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,而无需将其写入数据库。