我正在使用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)?感谢
答案 0 :(得分:1)
对于纯粹的多对多关系,请在模型中使用has_and_belongs_to_many关系。您的联接表不需要任何模型。使用has_many:通过关系,在连接表中需要其他数据(例如排序顺序或时间戳)。在这种情况下,完整的模型是合适的,模型需要主键。