Reputation: 13
I need to know if I've set up the models correctly.
I'm starting a new rails project which includes user, item, and order models. There will also be vendors, but as a reference to the User model. I'm not sure that I set up my models correctly, because when I created a seed file I got an error message 'ActiveRecord::RecordInvalid: Validation failed: Vendor must exist'. Does this mean that I should create a Vendor model instead of a User reference of Vendor? Including all my model files and seed file. Please let me know if my issue is unclear.
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: "[email protected]", password: "mila2013", street_address: "223 Washburn Ave.", city: "Washington", state: "NJ", balance: 25 )
lana = User.create(user_name: "Lana", email: "[email protected]", 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
------------------------------------------------------------------------
I expect that an item and order can have a vendor_id, that a vendor has_many orders and has_many items, and that a vendor is a reference to the User model (checkbox at signup if vendor).
Upvotes: 1
Views: 907
Reputation: 18454
Hardcoding ids is not a good practice (even when your db is empty - new record is not guaranteed to have id 1),
In your seeds - pass objects, like:
lana = User.create(user_name: "Lana", email: "[email protected]", password: "bony2015", street_address: "15 Schley Rd.", city: "Far Hills", state: "NJ", balance: 25 )
burrito = Item.create(name: "burrito", price: 8, vendor: lana)
Upvotes: 1