Rails 4生成无效的列名称

我有一个相当简单的查询来返回多对多关系中的第一个记录,或者如果它不存在则创建一个。

UserCategorization.where(category_id: 3, user_id: 5).first_or_create 

我的模型看起来像:

 class UserCategorization < ActiveRecord::Base belongs_to :user belongs_to :category self.primary_key = [:user_id, :category_id] end 

但是它在SQL中生成无效的列名:

 SQLite3::SQLException: no such column: user_categorizations.[:user_id, :category_id]: SELECT "user_categorizations".* FROM "user_categorizations" WHERE "user_categorizations"."category_id" = 3 AND "user_categorizations"."user_id" = 5 ORDER BY "user_categorizations"."[:user_id, :category_id]" ASC LIMIT 1 

如果我从模型中删除self.primary_key = [:user_id, :category_id] ,它可以正确检索记录但无法保存,因为它不知道在WHERE子句中使用什么:

 SQLite3::SQLException: no such column: user_categorizations.: UPDATE "user_categorizations" SET "score" = ? WHERE "user_categorizations"."" IS NULL 

谁看过这个吗?

我认为这两个建议中的一个可行:

首先,尝试添加以下迁移:

 add_index :user_categorizations, [:user_id, :category_id] 

确保在UserCategorization模型中保留self.primary_key = [:user_id, :category_id]

如果这不起作用,请销毁UserCategorization表并运行此迁移:

 def change create_table :user_categorizations do |t| t.references :user t.references :category t.timestamps end end 

references是Rails 4的新增内容。它们为指定的列添加了外键和索引。

祝好运!

所以看起来Rails 4 ActiveRecord不能很好地复合键,因此多对多模型会产生上述问题。 我通过使用ActiveRecord的这个扩展来修复它: http : //compositekeys.rubyforge.org/