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

时间:2013-11-21 01:51:55

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord firebird

我正在使用Rails 3.2.13和fb-adapter(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”;好吧,我用Google搜索了,我找到了Why do I get an Unknown Primary Key exception for a join table in Rails 4?

所以在我设置的连接模型中:

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

现在我可以创建一个新模型,但是当我尝试保存它时,我遇到了“Fb :: Error:Invalid token 生成器X_SEQ未定义“,因此基本上rails正在尝试获取id的下一个值,但因为该列没有为它创建生成器或序列。

以下是activerecord / relation.rb中的相关代码:

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

我不知道sqlite3 / mysql / postegres适配器是否也会发生这种情况,但我相信如果PK是复合轨道,不应该尝试获得“它的下一个值”..或者必须有一些防止它试图获得下一个值的方法..任何想法如何解决这个问题(没有修补activerecord)?感谢

1 个答案:

答案 0 :(得分:1)

对于纯粹的多对多关系,请在模型中使用has_and_belongs_to_many关系。您的联接表不需要任何模型。使用has_many:通过关系,在连接表中需要其他数据(例如排序顺序或时间戳)。在这种情况下,完整的模型是合适的,模型需要主键。