Rails 4生成无效的列名称

时间:2013-09-19 22:27:50

标签: sql ruby-on-rails ruby activerecord ruby-on-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

有没有人见过这个?

2 个答案:

答案 0 :(得分:0)

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

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

add_index :user_categorizations, [:user_id, :category_id]

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

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

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

references是Rails 4的新手。他们为指定的列添加了一个外键和索引。

祝你好运!

答案 1 :(得分:0)

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