【问题标题】:How do I create a seed file using a model with references? I'm not sure I set up the models correctly如何使用带有参考的模型创建种子文件?我不确定我是否正确设置了模型
【发布时间】:2019-01-12 14:29:14
【问题描述】:

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

我正在启动一个新的 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 orders 和 has_many items,并且供应商是对用户模型的引用(如果供应商,则在注册时选择复选框)。

【问题讨论】:

  • 模型看起来不错。你的种子文件是什么样的?
  • 不,您不必创建供应商模型,因为您的关联看起来是正确的,但是在播种数据时不要使用 vasfed 建议的硬编码 id.. 如果您愿意,也可以使用现有的 @ 987654323@ 对象在关联模型中创建记录,例如对于用户lana,您可以通过执行以下操作来创建卷饼项目:burrito = lana.items.create!(name: "burrito", price: 8) 您也可以在rails console 中尝试这些查询,一一执行以学习和了解生成的 sql。
  • 在控制台中试用后,我决定使用供应商模型。我根据您的建议删除了硬编码的 id,一切似乎都在基本正常工作。是时候编写更多代码了!谢谢你的回答:)

标签: ruby-on-rails


【解决方案1】:

硬编码 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)

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2021-08-18
    • 2019-10-12
    • 2011-04-06
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多