我使用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"])
INSERT INTO“MEMBER_ROLES”(“ID”,“NAME”,“ORG_ID”)VALUES(: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触发器处理它?</ p>
答案 0 :(得分:1)
这是因为oracle增强适配器的工作方式。检查these lines of code这用于从序列中获取值,因此我假设Active记录将使用create语句专门发送它,因此ID将显示在查询日志中。
答案 1 :(得分:1)
FYI,在Oracle中,您要使用触发和序列,您需要指定:
self.sequence_name = :autogenerated
在模型中,所以Ruby / Rails知道它不应该尝试将自己的ID推送到该表中。