我正在使用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触发器处理它?
这是由于oracle增强适配器的工作方式。 Check these lines of code这用于从序列中获取值,因此我假设Active Record将使用create语句专门发送该值,因此ID将显示在查询日志中。
仅供参考,在Oracle中,您需要执行触发器和序列,您需要指定:
self.sequence_name =:自动生成
在模型中,因此Ruby / Rails知道它不应该尝试将自己的ID推送到该表中。