【问题标题】:Why does rails specify primary key id manually in the insert statement?为什么rails在insert语句中手动指定主键id?
【发布时间】:2015-03-12 15:10:38
【问题描述】:

我正在使用 rails has_many_belongs_to_many 关联如下:

class MemberRole < ActiveRecord::Base
  attr_accessible :org_id, :name, :permission_ids
  has_and_belongs_to_many :permissions
end

class Permission < ActiveRecord::Base
  has_and_belongs_to_many :member_roles
end

我的join表如下:

CREATE TABLE MEMBER_ROLES_PERMISSIONS
( member_role_id NUMBER(38,0) NOT NULL REFERENCES member_roles,
  permission_id NUMBER(38,0) NOT NULL REFERENCES permissions
);

当我尝试按如下方式创建新记录时:

role = MemberRole.create(name: role_params["name"], org_id: role_params["org_id"], permission_ids: role_params["permission_ids"])

插入“MEMBER_ROLES”(“ID”、“NAME”、“ORG_ID”)值(:a1、:a2、 :a3) [["id", 66], ["name", "test100"], ["org_id", "2"]]

插入“MEMBER_ROLES_PERMISSIONS”(“MEMBER_ROLE_ID”, "PERMISSION_ID") 值 (66, 8)

上述方法的问题是我的 member_roles 表有如下创建的序列和触发器:

CREATE SEQUENCE MEMBER_ROLES_SEQ;

set define off;
CREATE OR REPLACE TRIGGER member_roles_bir 
BEFORE INSERT ON MEMBER_ROLES 
FOR EACH ROW

BEGIN
  SELECT MEMBER_ROLES_SEQ.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;

由于上述原因,表格中插入的“ID”是 67 而不是 66。

rails 是否应该尝试手动插入 id?有没有办法告诉 Rails 不处理 id 插入并让 oracle 触发器处理它?

【问题讨论】:

  • 普通的 ActiveRecord 模型也会发生同样的事情吗?这可能是 has_and_belongs_to_many 的一个怪癖,它是 Rails 第一个版本的产物。 has_many :through 是现在推荐的方法,因为它采用常规模型。
  • 嗯。 has_and_belongs_to_many 非常适合我的用例。我会尝试深入挖掘一下,看看是否是关联的问题。
  • @tadman。我尝试了'has_many,通过:关联,它做同样的事情。
  • 对常规模型有这种作用吗?如果是这样,那可能就是 Oracle 适配器的实现方式。
  • Rails 是否使用序列来计算手动值?还是别的什么?

标签: ruby-on-rails ruby oracle ruby-on-rails-3 rails-activerecord


【解决方案1】:

这是因为 oracle 增强型适配器的工作方式。检查these lines of code 这用于从序列中获取值,所以我假设活动记录将专门使用 create 语句发送它,因此 ID 会显示在查询日志中。

【讨论】:

  • 根据该代码,我的查询应该可以工作。但在我的示例中,它插入了 67 而不是 66。还是因为它被触发了两次。一次通过适配器,一次通过我定义的触发器?
  • 检查 oracle 数据库中序列中的最后一个值。
【解决方案2】:

仅供参考,在 Oracle 中,您有触发器和序列在起作用,您需要指定:

self.sequence_name = :autogenerated

在模型中,以便 Ruby/Rails 知道它不应该尝试将自己的 ID 推送到该表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2011-10-26
    • 2012-08-13
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多