ruby-on-rails - Rails 建模 : converting HABTM to has_many :through

标签 ruby-on-rails oracle primary-key data-modeling ora-01400

我正在一个现有的 Rails 站点上进行维护工作,但由于多对多关联,我遇到了一些问题。看起来该站点最初是使用 has_and_belongs_to_many 构建的对于一些在业务逻辑中变得更加复杂的关系,所以我需要使用 has_many :through而是支持关系表中的其他字段。但是,最初用于 HABTM 的连接表没有主键,我必须添加一个以支持使用 has_many :through 的单独关系建模。 .

将主键添加到包含大量数据的现有表的最佳方法是什么?有没有另一种方法可以做我想做的事情?

顺便说一下,系统运行在 Oracle 上。

谢谢!

贾斯汀

2009 年 11 月 9 日下午 3:58 更新:我不是 Oracle 专家,并且一直迷失在 Oracle 的非空、自动增量等版本的荒野中。最初,我尝试按照 Mike 和 Corey 的建议添加一个新字段作为主键,但 Oracle 不允许我将非空字段添加到非空表 (ORA-01758)。然后我将数据导出为 SQL,删除行,添加 PK 并将其设置为非空,然后尝试导入数据,但我不断收到错误,如“无法将 NULL 插入 id...” (ORA-01400)。

最后,我尝试使用 Corey 在他的评论中建议的迁移,但是 rake 遇到了与我手动更改数据库时 Oracle 抛出的相同错误(“无法将非空字段添加到非空表”)。我清除了表,运行了迁移(有效),然后尝试重新导入数据,但上次尝试导入时遇到了相同的错误(“无法将 NULL 插入 id...”)。如何保存我的数据并添加我需要的主键?我知道有人提出了编写 rake 任务的可能性,但我不确定如何在这方面进行。有任何想法吗?

最佳答案

我用 SQL Developer在管理 oracle 数据库时。只需创建列并向数据库添加约束,例如:

sql> alter table Employee add constraint Employee_pk primary key(Employee_ID);

也许见 here了解更多细节。

编辑:

现在我重新考虑了这一点,你应该能够在迁移中做到这一点
add_column :table, :id, :primary_key

然后,您需要在迁移中植入一些数据。只是遍历并添加索引的 ruby​​ 代码。见 seed_fudb-populate求助。 Rails 3 将允许您使用 rake db:seed 播种数据。

关于ruby-on-rails - Rails 建模 : converting HABTM to has_many :through,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702441/

相关文章:

ruby-on-rails - Rails - 指定资源可用操作的良好实践?

ruby-on-rails - 尝试安装 rubber gem,Nokogiri 把它搞砸了?

oracle - groovy oracle - 找不到合适的驱动程序

oracle - 如何将 Oracle 表标记为所有者只读(取消)标记为只读?

mysql - guid 作为主键?

mysql - 修改 AUTO_INCREMENT PRIMARY KEY 进行分区

javascript - 在我的案例中如何使用单选按钮选中或单击的属性

java - 在集群环境中跨 JSP 应用程序共享 HashMap

sql - 从数据库列创建一个唯一的主键(散列)

ruby-on-rails - 推送到 Heroku 时出现 Assets 错误