gpt4 book ai didi

ruby-on-rails - db :migration 后未生成 Ruby on Rails id 列

转载 作者:行者123 更新时间:2023-12-04 16:11:14 24 4
gpt4 key购买 nike

我正在学习关于 coursera 的类(class)我正在执行我的第一份作业,详情可在 this 上找到和 this关联。当我运行 rspec 时,我发现测试用例失败了,原来我的模式中没有 ID 列。在类(class)中它说当我运行迁移时,ID 列是自动生成的,就像 created_at 和 updated_at 一样。任何人都知道为什么可能没有生成 id 列。我知道我可以通过在新迁移中指定它来解决这个问题,但只是想知道原因。

这是我目前拥有的架构:

ActiveRecord::Schema.define(version: 20161108162529) do

create_table "profiles", force: :cascade do |t|
t.string "gender"
t.integer "birth_year"
t.string "first_name"
t.string "last_name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "todo_items", force: :cascade do |t|
t.date "due_date"
t.string "title"
t.text "description"
t.boolean "completed", default: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "todo_lists", force: :cascade do |t|
t.string "list_name"
t.date "list_due_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "users", force: :cascade do |t|
t.string "username"
t.string "password_digest"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

end

这是 todolist 的迁移:

class CreateTodoLists < ActiveRecord::Migration
def change
create_table :todo_lists do |t|
t.string :list_name
t.date :list_due_date

t.timestamps null: false
end
end
end

它生成的模型类:

class TodoList < ActiveRecord::Base
end

我的方法是按照要求在 assignment.rb 文件中插入一条记录:

 def create_todolist(params)
# accept a hash of todolist properties (`:name` and `:due_date`) as an input parameter. Note these are not 100% the same as Model class.
# use the TodoList Model class to create a new user in the DB
# return an instance of the class with primary key (`id`), and dates (`created_at` and `updated_at`) assigned
t1 = TodoList.new
t1.list_name = params["name"]
t1.list_due_date = params["due_date"]
t1.save
TodoList.first
end

失败的 rspec 代码:

context "rq03.2 assignment code has create_todolist method" do
it { is_expected.to respond_to(:create_todolist) }
it "should create_todolist with provided parameters" do
expect(TodoList.find_by list_name: "mylist").to be_nil
due_date=Date.today
assignment.create_todolist(:name=> 'mylist', :due_date=>due_date)
testList = TodoList.find_by list_name: 'mylist'
expect(testList.id).not_to be_nil
expect(testList.list_name).to eq "mylist"
expect(testList.list_due_date).to eq due_date
expect(testList.created_at).not_to be_nil
expect(testList.updated_at).not_to be_nil
end

测试失败时我收到的实际消息:

失败:

1) Assignment rq03 rq03.2 assignment code has create_todolist method should create_todolist with provided parameters
Failure/Error: expect(testList.id).not_to be_nil

NoMethodError:
undefined method `id' for nil:NilClass
# ./spec/assignment_spec.rb:173:in `block (4 levels) in <top (required)>'
# ./spec/assignment_spec.rb:14:in `block (2 levels) in <top (required)>'

最佳答案

架构不会显示 ID 列。我仔细检查了我的一个 Rails 应用程序:

db/schema.rb

create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "first_name"
t.string "last_name"
end

当我在 Postgres 中用 \d users 描述表时,我看到了 id 列:

         Column         |            Type             |                     Modifiers
------------------------+-----------------------------+----------------------------------------------------
id | integer | not null default nextval('users_id_seq'::regclass)
email | character varying | not null default ''::character varying
first_name | character varying |
last_name | character varying |

如果您出于某种原因不需要 ID,可以通过将 id: false 传递给 create_table 来省略它。

create_table :users, id: false do |t|
#...
end

users 表可能是个糟糕的主意 :-)


更新

看起来您实际上并没有创建新的 TodoList

此处的线索在错误中:“nil:NilClass 的未定义方法‘id’”。您的 testList 为零。

一个好的技巧是在测试中始终使用 ActiveRecord 的“bang”方法。如果失败,这将导致它们抛出异常。这在尝试追踪错误时非常有用——您会找到有实际错误的地方,而不是一些副作用。

我打赌你可以更新你的 create_todolist 来帮助追踪这个

def create_todolist(params)
# Updated: To use ActiveRecord create! method.
# This will throw an exception if it fails.
TodoList.create!(list_name: params[:name], due_date: params[:due_date])
end

我还会更新您的规范,方法是更改​​:

  testList = TodoList.find_by list_name: 'mylist'

使用刘海:

  testList = TodoList.find_by! list_name: 'mylist'

关于ruby-on-rails - db :migration 后未生成 Ruby on Rails id 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40528834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com