【问题标题】:Rails 4 Generating Invalid Column NamesRails 4生成无效的列名
【发布时间】:2013-09-19 22:27:50
【问题描述】:

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

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

有人见过吗?

【问题讨论】:

  • 是的,但是看看它是怎么说列名是确切的字符串[:user_id, :category_id]?这可能是由于self.primary_key 设置所致。
  • 你为什么要以你现在的方式显式设置主键? Rails 会自动推断相关模型的主键。您是否要创建复合主键?
  • 啊,所以当我删除它时它可以正确检索它,但是当我尝试更改变量并保存时,它会尝试在没有主键的情况下进行更新:SQLite3::SQLException: no such column: user_categorizations.: UPDATE "user_categorizations" SET "score" = ? WHERE "user_categorizations"."" IS NULL

标签: sql ruby-on-rails ruby activerecord ruby-on-rails-4


【解决方案1】:

我认为这两个建议之一会起作用:

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

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 的新成员。它们为指定的列添加外键和索引。

祝你好运!

【讨论】:

  • 索引似乎没有修复它。我需要为连接表使用id: false 吗?谢谢!
  • 我认为 id: false 不会起作用。我会尝试我的第二个建议。它是 Rails 4 的新功能。
【解决方案2】:

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

【讨论】:

  • 听起来很奇怪,ActiveRecord 只能部分处理多对多?
  • 这很奇怪。问题是我的多对多关系也是一个具有两个复合键的模型,而 Rails 没有正确处理。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多