gpt4 book ai didi

postgresql - 使用 PostgreSQL 作为数据库在 Rails 中创建新对象时没有 ID

转载 作者:行者123 更新时间:2023-11-29 12:14:50 25 4
gpt4 key购买 nike

我的设置如下:我使用 Rails 3.0.1 和 PostgreSQL 9.0 数据库。我将我的模型组织在子模块中。

当我使用控制台创建任何类型的新对象 (c =::Physical::Base::Contact.new) 并保存它时,对象的 ID 是不会自动填写。它被写入数据库,但我刚刚创建的对象没有注意到 PostgreSQL 中序列生成的 ID。我创建表的迁移脚本如下。我自己编写它们,并没有使用标准 Rails 生成功能来更好地控制我的表。

这是标准的 PostgreSQL+Rails 行为,还是我自己编写迁移而遗漏了什么?

class Contact < ActiveRecord::Migration
def self.up
execute "
create table contacts(
id serial,
contact_type_id integer not null check (contact_type_id > 0),
value text not null check (length(value) > 0)
)
"
end

def self.down
execute "
drop table contacts;
"
end
end

最佳答案

确保你在你的表上设置了一个主键,我最近遇到了同样的问题,这非常令人沮丧。我决定使用迁移重新创建表,并注意到我的旧表没有主键。添加后,一切都按预期进行!

您将需要诸如“alter table contacts add primary key(id)”之类的东西——如果该字段上没有主键索引,ActiveRecord 似乎无法理解。

在主键之前我会得到:

ruby-1.9.2-p0 > Job.create
=> #<Job id: nil, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil>

现在我已经添加了主键,结果是:

ruby-1.9.2-p0 > Job.create
=> #<Job id: 17937, data: nil, timestamp: nil, enqueued_at: nil, started_at: nil, completed_at: nil, status: nil, result: nil, job_queue_id: nil, job_handle: nil, uniq: nil, priority: nil, server_id: nil>

关于postgresql - 使用 PostgreSQL 作为数据库在 Rails 中创建新对象时没有 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442739/

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