【发布时间】:2010-04-13 19:52:37
【问题描述】:
注意:这是this question 的“railsier”(更简洁)版本,有点长。
我无法在开发服务器上复制生产服务器上的 Rails 行为。除了凭据和缓存设置之外,代码库是相同的,并且两者都由具有相同架构(但数据不同)的 Oracle 10g 数据库提供支持。
我的 Rails 应用程序包含一个用户模型,它有一个注册;通过registration_ownerships 表依次注册has_and_belongs_to_many company_ownerships。注册后,用户填写与所有三个模型相关的数据,包括一系列复选框,指示哪些 registration_ownerships 可能适用于他们的帐户。
在开发服务器上,无论输入什么数据,注册过程都是无缝的。然而,在生产环境中,如果用户在提交注册之前检查了任何公司所有权字段,Oracle 会抱怨 company_ownerships 表的主键(这是基于 company_ownership_id 和registration_id 的双字段键)和用户的主键违反约束获取标准 Rails 500 错误屏幕。在每种情况下,我都验证了生产数据库中不存在这两个字段的冲突记录,所以我不知道为什么违反了约束。
更令人困惑的是,如果用户在没有列出任何所有权的情况下注册,然后返回并修改其帐户以反映所有权数据(通过相同的界面完成),应用程序会很高兴地满足他们的请求,而 Oracle 很好——表现良好(这在生产和开发中都是如此)。
在过去的几天里,我一直在试图找出可能导致此问题的原因,但我已经走到了尽头。任何建议将不胜感激!
2010 年 4 月 15 日更新: 我刚刚注意到一些可能有用的东西。我尝试在开发和生产中注册相同的帐户,并故意将“电话”字段留空,这是一个必填字段。在开发中,我收到了以下消息:
1 个错误禁止保存此注册
以下字段存在问题:
- 电话不能为空
但是,在生产中,我得到了这个:
2 个错误禁止保存此注册
以下字段存在问题:
- 电话不能为空
- 电话不能为空
我的猜测是,这与生产中违反的约束直接相关——也许作为提交的一部分,该字段被插入一次,然后再次插入,但第二次违反了约束,然后回滚整个事务,删除初始插入的所有证据。关于在 Rails 端或 Oracle 端可能导致这种行为的任何想法?
【问题讨论】:
标签: ruby-on-rails oracle model constraints