首页 > 解决方案 > 如何使用带有参考的模型创建种子文件?我不确定我是否正确设置了模型

问题描述

我需要知道我是否正确设置了模型。

我正在开始一个新的 Rails 项目,其中包括用户、项目和订单模型。也会有供应商,但作为对 User 模型的参考。我不确定我是否正确设置了模型,因为当我创建种子文件时,我收到一条错误消息“ActiveRecord::RecordInvalid: Validation failed: Vendor must exist”。这是否意味着我应该创建一个供应商模型而不是供应商的用户参考?包括我所有的模型文件和种子文件。如果我的问题不清楚,请告诉我。

class Item < ApplicationRecord
  belongs_to :vendor, :class_name => "User", :foreign_key  => "vendor_id"
  has_and_belongs_to_many :orders
end

class Order < ApplicationRecord
  belongs_to :vendor, :class_name => "User", :foreign_key  => "vendor_id"
  belongs_to :user
  has_and_belongs_to_many :items

  def readable_date
    self.date.strftime("%b %d, %Y")
  end

  def deliver
    self.delivered = true
    self.user.balance -= 5
  end

end

class User < ApplicationRecord
  has_many :orders
  has_many :items, :through => :orders


  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :omniauthable, :omniauth_providers => [:facebook]

  def self.from_omniauth(auth)
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.provider = auth.provider
       user.uid = auth.uid
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
     end
  end

end

#seeds.rb -------------------------------------------------------------

brittany = User.create(user_name: "Brittany", email: "brittanygrebnova@gmail.com", password: "mila2013", street_address: "223 Washburn Ave.", city: "Washington", state: "NJ", balance: 25 )
lana = User.create(user_name: "Lana", email: "lanagrebnova@gmail.com", password: "bony2015", street_address: "15 Schley Rd.", city: "Far Hills", state: "NJ", balance: 25 )

burrito = Item.create(name: "burrito", price: 8, vendor_id: 1)
tacos = Item.create(name: "tacos", price: 7, vendor_id: 1)
churros = Item.create(name: "churros", price: 6, vendor_id: 1)

pizza = Item.create(name: "slice a pizza", price: 3, vendor_id: 2)
garlic_knots = Item.create(name: "10 garlic knots", price: 5, vendor_id: 2)
tiramisu = Item.create(name: "tiramisu", price: 4, vendor_id: 2)

red_curry = Item.create(name: "red curry", price: 10, vendor_id: 3)
drunken_noodles = Item.create(name: "drunken noodles", price: 12, vendor_id: 3)
coconut_pudding = Item.create(name: "coconut pudding", price: 7, vendor_id: 3)

first_order = Order.create(date: Date.today, vendor_id: 1, user_id: 1)
first_order.items = burrito, churros

second_order = Order.create(date: Date.today, vendor_id: 2, user_id: 2)
second_order.items = red_curry, coconut_pudding

------------------------------------------------------------------------

#schema.rb -------------------------------------------------------------

ActiveRecord::Schema.define(version: 2019_01_11_164506) do

  create_table "items", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "name"
    t.integer "price"
    t.integer "vendor_id"
  end

  create_table "items_orders", force: :cascade do |t|
    t.integer "item_id"
    t.integer "order_id"
  end

  create_table "orders", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.datetime "date"
    t.string "vendor_id"
    t.string "user_id"
    t.integer "delivery_charge", default: 5
    t.boolean "delivered"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "provider"
    t.string "uid"
    t.string "user_name"
    t.string "street_address"
    t.string "city"
    t.integer "balance"
    t.string "state"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

end

------------------------------------------------------------------------

我希望一个项目和订单可以有一个 vendor_id,一个供应商 has_many 订单和 has_many 项目,并且一个供应商是对用户模型的引用(如果是供应商,则在注册时的复选框)。

标签: ruby-on-rails

解决方案


硬编码 id 不是一个好习惯(即使您的数据库为空 - 新记录也不能保证 id 为 1),

在您的种子中 - 传递对象,例如:

lana = User.create(user_name: "Lana", email: "lanagrebnova@gmail.com", password: "bony2015", street_address: "15 Schley Rd.", city: "Far Hills", state: "NJ", balance: 25 )
burrito = Item.create(name: "burrito", price: 8, vendor: lana)

推荐阅读