Rails中has_and_belongs_to_many的ActiveRecord::UnknownPrimaryKey错误

4

我遇到了一些困难,无法使has_and_belongs_to关系正常工作。

分类模型:

class Category < ActiveRecord::Base 
  has_and_belongs_to_many :products
end

产品型号:

class Product < ActiveRecord::Base
  has_many :orders, foreign_key: 'sku', primary_key: 'sku' 
  has_and_belongs_to_many :categories       
end

我正在使用一个现有的数据库,并为所有需要的数据创建了模型,将列映射到Rails命名规则。

以下是视图的结构:

分类视图:

categories
    id
    name
    category_parent

产品视图:

products
    id
    sku
    price
    title

产品分类合并视图:

categories_products
    category_id
    product_id

这是我在控制台上进行测试并产生的错误:

2.0.0p247 :017 > Product.first.categories
  Product Load (1.0ms)  SELECT `products`.* FROM `products` LIMIT 1
ActiveRecord::UnknownPrimaryKey: Unknown primary key for table categories in model Category.

我尝试去掉产品的其他关联,以消除任何可能的冲突:

has_many :orders, foreign_key: 'sku', primary_key: 'sku' 

但是没有它也可以得到相同的结果。
另一个关联正常运行:
Order.first.product
  Order Load (2.9ms)  SELECT `orders`.* FROM `orders` ORDER BY `orders`.`id` ASC LIMIT 1
  Product Load (5.7ms)  SELECT `products`.* FROM `products` WHERE `products`.`sku` = '826663144369' LIMIT 1
 => #<Product id: 218464, sku: "1234567890", price: #<BigDecimal:7fabdb577428,'0.2195E2',18(18)>, title: "Blah blah blah"> 

我使用的是Ruby 2.0.0p247和Rails 4.0.0。
4个回答

3
我已经让它与以下类别和产品模型的增加一起工作:

我已经让它与以下类别和产品模型的增加一起工作:

self.primary_key = :id 

我猜Rails无法识别用于关联的主键,因为我使用的是视图,而视图没有键。

这让我困扰了一段时间,一直在试图修复“丢失”的主字段!!谢谢。 - Bob Roberts

0

在创建没有id列的“has many through”关系的连接表时,我遇到了这个问题。

class CreateMemberships < ActiveRecord::Migration
  def change
    create_table :memberships, id: false do |t|
      t.references :project, index: true
      t.references :user, index: true
    end
  end
end

修复方法是将primary_key设置为project_iduser_id,因此在模型中:

class Membership < ActiveRecord::Base
  self.primary_key = [:project_id, :user_id]
  belongs_to :project
  belongs_to :user
end

在Rails 5中,我通过将主键设置为其中一个外键之一来解决了这个问题。 self.primary_key = :project_id。无论我选择哪一个,Active Record都会正确连接它,尽管你的解决方案对我没有起作用。 - Ailison Carvalho

0

我刚刚遇到了这个问题,我的情况是因为我将生产应用程序的数据恢复到了一个本地副本中,该副本具有生产版本中不存在的其他视图。在恢复时,从生产中导入了数据(包括正确的模式),但我在本地开发数据库中拥有的更近期的模式仍然包括一个视图,该视图是由应用程序的另一个分支中存在的迁移创建的。完全删除本地数据库,并在开发数据库的新副本上重新运行pg_restore,可以删除该分支不知道的视图。希望这可以帮助到你。


0

我有很多问题,评论区没有足够的空间,所以我在这里写下了答案。

你说:

我正在使用现有的数据库,并为所有需要的数据创建了模型,将列映射到Rails命名约定。

你的意思是在数据库中创建视图以将事物映射到Rails命名约定吗?

我也有点困惑为什么sku列被用作外键和主键,尽管表中有一个id列。但看起来这个关系运行良好。

我知道的唯一一个(可能还有很多)导致ActiveRecord::UnknownPrimaryKey错误的原因是其中一个模型表缺少id列,但从你的描述中,categories和products似乎都有一个id列。


是的,那是一个打字错误,我为所有需要的数据创建了视图。我在“订单”关联中将sku设置为主键和外键,因为订单通过sku与产品相关联,而不是产品ID。我尝试删除该关联,但结果并没有改变。是的,类别和产品都有ID列,虽然严格意义上来说它们不是主键,因为视图没有主键。 - andreobrown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接