Rails 如何使用来自另一个 table 的数据在 seeds.rb 中播种 table

Rails how to seed a table in seeds.rb with data from another table

我的应用程序中有 2 个 table 具有一对一关系。这是两个 table 的架构:

    create_table "users", primary_key: "user_id", force: true do |t|
      t.string  "user_username", limit: 30, null: false
      t.string  "user_password", limit: 30, null: false
      t.integer "roles_role_id", limit: 1,  null: false
    end

    add_index "users", ["roles_role_id"], name: "fk_users_roles1_idx", using: :btree
    add_index "users", ["user_id"], name: "user_id", unique: true, using: :btree
    add_index "users", ["user_username"], name: "user_username_UNIQUE", unique: true, using: :btree

    create_table "customers", primary_key: "customer_id", force: true do |t|
      t.string  "cust_email",     limit: 75
      t.string  "cust_phone1",    limit: 20
      t.string  "cust_phone2",    limit: 20
      t.string  "cust_title",     limit: 4
      t.string  "cust_firstname", limit: 40
      t.string  "cust_lastname",  limit: 40
      t.integer "users_user_id",             null: false
    end

    add_index "customers", ["cust_lastname", "cust_firstname"], name:"NAME_LAST_FIRST", using: :btree
    add_index "customers", ["users_user_id"], name: "fk_customers_users1_idx", using: :btree

    add_foreign_key "customers", "users", name: "customers_users_user_id_fk", column: "users_user_id", primary_key: "user_id"
    add_foreign_key "customers", "users", name: "fk_customers_users1", column: "users_user_id", primary_key: "user_id", dependent: :delete, options: "ON UPDATE CASCADE"

    add_foreign_key "users", "roles", name: "fk_users_roles1", column: "roles_role_id", primary_key: "role_id", dependent: :delete, options: "ON UPDATE CASCADE"
    add_foreign_key "users", "roles", name: "users_roles_role_id_fk", column: "roles_role_id", primary_key: "role_id"

如您所知,还有其他 table 与这些 table 相关。自下而上地工作,创建 Customer 对象是当前的瓶颈,因为它是第一个 table 依赖于另一个对象的数据。

以下是模型:

  class User < ActiveRecord::Base
      has_one :role
  end

  class Customer < ActiveRecord::Base
      belongs_to :user
      has_one :address
      has_many :accounts
  end

这就是我在 seeds.rb 中尝试做的事情:

  # Generate 80 users (with "customer" role) (Admins created separately)
  80.times do
      username = "#{Faker::Hacker.ingverb}#{Faker::Hacker.noun}#{rand(99)}"
      u = User.new
          u.user_id = SecureRandom.random_number(999999999)
          u.user_username = username
          u.user_password = SecureRandom.base64(12)
          u.roles_role_id = 2
      u.save
  end

  # Generate 80 customers
  80.times do
      c = Customer.new
          firstname = "#{Faker::Name.first_name}"
          lastname = "#{Faker::Name.last_name}"
          user_id = User.select(:user_id).distinct

          c.customer_id = SecureRandom.random_number(999999999)
          c.cust_email = "#{Faker::Internet.free_email(firstname)}"
          c.cust_phone1 = "#{Faker::PhoneNumber.phone_number}"
          c.cust_phone2 = "#{Faker::PhoneNumber.cell_phone}"
          c.cust_title = "#{Faker::Name.prefix}"
          c.cust_firstname = firstname
          c.cust_lastname = lastname
          c.users_user_id = user_id
      c.save
  end

用户已经在我的数据库中生成得很好,但现在我需要的是根据这些 [=31] 为创建的每个客户对象分配一个唯一的(不重复的)user_id =] 在用户 table 中可用。这就是我的客户与用户关联的方式(请注意,将来会有不同类型的用户,而不仅仅是客户)。约束已构建,现在如何在创建 Customer 对象时引用该字段 (user_id)?以及如何防止它重复使用已经分配的 user_id?

如果这是一个 "newb" 问题,我很抱歉,是的,我已经用谷歌搜索死了。非常感谢您的帮助!

您可以将 80 个用户存储在一个数组中,当您创建新客户时,只需使用其中一个。当您循环创建客户时,我只有一个变量 i,它是一个整数,将引用数组中的用户。

users = []
  80.times do
      username = "#{Faker::Hacker.ingverb}#{Faker::Hacker.noun}#{rand(99)}"
      u = User.new
          u.user_id = SecureRandom.random_number(999999999)
          u.user_username = username
          u.user_password = SecureRandom.base64(12)
          u.roles_role_id = 2
      u.save
      users << u
  end

  # Generate 80 customers
  80.times do |i|
      c = Customer.new
          firstname = "#{Faker::Name.first_name}"
          lastname = "#{Faker::Name.last_name}"

          c.users_user_id = users[i].user_id
          c.customer_id = SecureRandom.random_number(999999999)
          c.cust_email = "#{Faker::Internet.free_email(firstname)}"
          c.cust_phone1 = "#{Faker::PhoneNumber.phone_number}"
          c.cust_phone2 = "#{Faker::PhoneNumber.cell_phone}"
          c.cust_title = "#{Faker::Name.prefix}"
          c.cust_firstname = firstname
          c.cust_lastname = lastname
      c.save
  end