Как мне создать начальный файл, используя модель со ссылками? Я не уверен, что правильно настроил модели - PullRequest
0 голосов
/ 12 января 2019

Мне нужно знать, правильно ли я настроил модели.

Я запускаю новый проект рельсов, который включает модели пользователей, предметов и заказов. Также будут продавцы, но в качестве ссылки на модель пользователя. Я не уверен, что правильно настроил свои модели, потому что при создании начального файла я получал сообщение об ошибке «ActiveRecord :: RecordInvalid: Ошибка проверки: поставщик должен существовать». Означает ли это, что я должен создать модель Vendor вместо пользовательской ссылки Vendor? Включая все мои файлы моделей и начальный файл. Пожалуйста, дайте мне знать, если моя проблема неясна.

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 товаров, и что поставщик является ссылкой на модель User (флажок при регистрации, если vendor).

1 Ответ

0 голосов
/ 12 января 2019

Жесткое кодирование идентификаторов не является хорошей практикой (даже если ваша база данных пуста - новая запись не обязательно будет иметь идентификатор 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...