我应该如何在Rails 5.1中命名和创建外键?

时间:2018-01-08 10:16:59

标签: ruby-on-rails sqlite rails-activerecord

我刚开始使用Rails进行开发,所以我想我会为我的家人制作一个费用跟踪应用程序。我肯定会变得很明显,我仍然围着创建几个数据库表并将它们全部正确链接在一起。我已经完成了Hartl rails教程,但这是我第一次尝试制作自己的东西。

该应用程序的核心是费用的集合。每个费用都有一个金额,一个日期,对供应商表的引用,以及对ExpenseTypes表的引用。问题是,我通过数据库种子生成了一个费用,但它没有正确引用其他表中的条目:

这是我创建它的方式,作为seeds.rb中的最后一个条目:

Expense.create!(amount: 500, date: Date.today, vendor_id: Vendor.first,  expensetype_id: ExpenseType.second, note: "This is the first expense!")

但是当我进入控制台检查它时:

2.3.4 :002 > Expense.first
Expense Load (0.2ms)  SELECT  "expenses".* FROM "expenses" ORDER BY "expenses"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Expense id: 1, amount: 500, date: "2018-01-08", vendor_id: nil, expensetype_id: nil, note: "This is the first expense!", created_at: "2018-01-08 09:37:19", updated_at: "2018-01-08 09:37:19">

我怀疑这是因为桌子有点笨拙地命名,但我没有足够的经验知道肯定会发生什么。我尝试在CamelCase中命名我的类并通过“rails generate migration”生成迁移,但是我不确定基于表和类名中的下划线和复数,它正在进行什么样的替换和搜索。

这是schema.rb:

  create_table "expense_types", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["name"], name: "index_expense_types_on_name"
  end

  create_table "expenses", force: :cascade do |t|
    t.integer "amount", null: false
    t.date "date"
    t.integer "vendor_id"
    t.integer "expensetype_id"
    t.string "note"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["expensetype_id"], name: "index_expenses_on_expensetype_id"
    t.index ["vendor_id"], name: "index_expenses_on_vendor_id"
  end

  create_table "vendors", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["name"], name: "index_vendors_on_name"
  end

这是其他的seeds.db:

# Vendors
vendor_list = ["Vendor 1", "Vendor 2", "Vendor 3", "Vendor 4"]

vendor_list.each do |item|
  Vendor.create!(name: item)
end

#Expense types
expense_type_list = ["Daily groceries", "Eating out", "Travel", "Present"]

expense_type_list.each do |item|
  ExpenseType.create!(name: item)
end

最后,expense.rb,它是自动生成的:

class Expense < ApplicationRecord
  belongs_to :vendor
  belongs_to :expensetype
end

也许那应该是has_one?我尝试改变它,但没有任何区别。我有点羞于生成迁移来更改Expense表,因为我不想用无意义或破坏的迁移来填充文件夹,而且我仍然不擅长使用它们。

我忘记了重要的事吗?是否有我可以生成的迁移,可以让所有内容正确地相互连接?感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

首先,您必须更新Expense模型:

class Expense < ApplicationRecord
  belongs_to :vendor
  belongs_to :expense_type
end

因为它应该是expense_type而不是expensetype - 您必须尊重模型名称。

其次,您正在创建费用,但您将对象作为id传递。如果你引用vendor_id然后传递id,if if vendor然后传递一个对象:

Expense.create!(amount: 500, date: Date.today, vendor: Vendor.first,  expense_type: ExpenseType.second, note: "This is the first expense!")

总结一下,我发现了两个问题:

  1. 您在ExpenseType
  2. 关联中拼错了Expense.create!模型名称
  3. 您将对象传递给vendor_idexpense_type_id
相关问题