我刚开始使用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表,因为我不想用无意义或破坏的迁移来填充文件夹,而且我仍然不擅长使用它们。
我忘记了重要的事吗?是否有我可以生成的迁移,可以让所有内容正确地相互连接?感谢您提供任何帮助!
答案 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!")
总结一下,我发现了两个问题:
ExpenseType
Expense.create!
模型名称
vendor_id
和expense_type_id