Ruby on rails 如何阻止rails为没有id的联接表调用next_seq?

Ruby on rails 如何阻止rails为没有id的联接表调用next_seq?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,firebird,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Firebird,我正在使用Rails 3.2.13和fb适配器(firebird,但我认为这与本文无关) 我有一个连接模型,其他两个模型使用“has_many a,through:X” 我创建了一个没有“id”的表(根据rails指南和常识,因为pk是两者的组合),如下所示: create table "X", id: false do |t| t.integer "a_id", null: false t.integer "b_id", null: false end 然后,当我尝试创建一个模型时,

我正在使用Rails 3.2.13和fb适配器(firebird,但我认为这与本文无关)

我有一个连接模型,其他两个模型使用“has_many a,through:X”

我创建了一个没有“id”的表(根据rails指南和常识,因为pk是两者的组合),如下所示:

create table "X", id: false do |t|
  t.integer "a_id", null: false
  t.integer "b_id", null: false
end
然后,当我尝试创建一个模型时,我得到了“ActiveRecord::UnknownPrimaryKey”;好吧,我在谷歌上搜索了一下,找到了

因此,在我设置的联接模型中:

class X < ActiveRecord::Base
  self.primary_key = [:a_id, :b_id]
  ...
end

我不知道sqlite3/mysql/postegres适配器是否也会出现这种情况,但我相信如果PK是复合的,rails不应该尝试获取“下一个值”。。或者必须有某种方法阻止它尝试获取下一个值。。有没有办法解决这个问题(无需修补activerecord)?感谢

对于纯多对多关系,请在您的模型中使用关系。联接表不需要模型。使用:通过连接表中需要额外数据(如排序顺序或时间戳)的关系。在这种情况下,一个成熟的模型是合适的,模型需要一个主键。

我的模型有其他数据,我在这里介绍的是一个简化,重点是这个问题。。我再次阅读了rails指南,看起来你是对的。指南建议只在HABTM的小节中使用“id:false”。。这对我来说没有什么意义,但它看起来像是“rails方式”,因为它不支持复合pk。
def insert(values)
  primary_key_value = nil

  if primary_key && Hash === values
    primary_key_value = values[values.keys.find { |k|
      k.name == primary_key
    }]

    if !primary_key_value && connection.prefetch_primary_key?(klass.table_name)
      ### exception get's raised here in next_sequence_value ###
      primary_key_value = connection.next_sequence_value(klass.sequence_name)
      values[klass.arel_table[klass.primary_key]] = primary_key_value
    end
  end

  ...
end