Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么rails在insert语句中手动指定主键id?_Ruby On Rails_Ruby_Oracle_Ruby On Rails 3_Rails Activerecord - Fatal编程技术网

Ruby on rails 为什么rails在insert语句中手动指定主键id?

Ruby on rails 为什么rails在insert语句中手动指定主键id?,ruby-on-rails,ruby,oracle,ruby-on-rails-3,rails-activerecord,Ruby On Rails,Ruby,Oracle,Ruby On Rails 3,Rails Activerecord,我使用的rails有多个属于多个协会,如下所示: 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 CREA

我使用的rails有多个属于多个协会,如下所示:

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"])
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;
当我尝试创建新记录时,如下所示:

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"])
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”、“名称”、“组织ID”)中插入值(:a1、:a2、, :a3)[“id”,66],“名称”,“测试100”],[“组织id”,“2”]

插入“成员角色权限”(“成员角色ID”), “权限ID”)值(66,8)

上述方法的问题在于,我的member_roles表创建的序列和触发器如下所示:

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"])
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增强适配器的工作方式。选中此复选框用于从序列中获取值,因此我假设活动记录将与create语句一起专门发送此复选框,因此ID将显示在查询日志中

FYI,在Oracle中,触发器和序列处于活动状态,您需要指定:

self.sequence_name = :autogenerated

在模型中,这样Ruby/Rails就知道它不应该将自己的ID推送到该表中。

常规ActiveRecord模型中也会发生同样的情况吗?这可能是
has\u和\u属于\u many
的一个怪癖,这是Rails最早版本的产物
有很多:通过
是现在推荐的方法,因为它使用了常规型号。Hmmm。has_和Own_to_对于我的用例来说非常有意义。“我将试着深入挖掘lil,看看这是否与联想有关。”塔德曼说。我试过“有很多,通过:关联,它也做同样的事情。它对普通模型也这样做吗?”?如果是这样的话,可能是Oracle适配器的实现方式。Rails是否使用序列来计算手动值?还是别的什么?根据代码,我的查询应该是有效的。但在我的示例中,它插入了67而不是66。或者是因为它被触发了两次。一次通过适配器,一次通过我定义的触发器?检查oracle数据库序列中的最后一个值。