为什么Rails在insert语句中手动指定主键ID?

问题描述 投票:5回答:2

我正在使用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

我的联接表如下:

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],[“名称”,“ 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触发器处理它?

ruby-on-rails ruby oracle ruby-on-rails-3 rails-activerecord
2个回答
1
投票

这是由于oracle增强适配器的工作方式。 Check these lines of code这用于从序列中获取值,因此我假设Active Record将使用create语句专门发送该值,因此ID将显示在查询日志中。


0
投票

仅供参考,在Oracle中,您需要执行触发器和序列,您需要指定:

self.sequence_name =:自动生成

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

© www.soinside.com 2019 - 2024. All rights reserved.