2013-10-06 55 views
2

我在获取has_and_belongs_to关系时遇到困难。Rails has_and_belongs_to_many ActiveRecord :: UnknownPrimaryKey

分类模型:

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 

我使用现有的数据库,并建立模型所需的所有数据,映射列轨道命名约定。

这里是意见的结构:

类别查看:

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

回答

2

我得到了它具有以下除类别和产品型号工作:

self.primary_key = :id 

我猜测,因为我使用视图轨不能识别主键使用的关联,并且视图没有键。

+0

这让我在试图修复“失踪”主场的圈子里跑步!谢谢。 –

0

我有很多的问题,并没有足够的空间在评论,所以我只是写一个答案。

你说

我使用现有的数据库,并创建了模型中的所有数据 需要,映射列轨道命名约定。

你的意思是说你在数据库中创建VIEWS以将事物映射到轨道命名约定?

我也有点困惑,为什么sku列被用作外键和主键事件,尽管表中有一个id列。但它看起来像这种关系正常工作。

我知道ActiveRecord::UnknownPrimaryKey错误的唯一原因是我知道(有可能还有很多),其中一个模型表缺少id列,但这两个类别和产品似乎都有一个来自您写的内容。

+0

是的,这是一个错字,我创建的视图用于所需的所有数据。我将sku设置为'订单'关联中的主键和外键,因为订单通过sku链接到产品,而不是产品ID。我尝试删除该关联,但它不会改变结果。是的,类别和产品都有ID列,尽管它们并非严格意义上的主键,因为视图没有主键。 – andreobrown

0

我刚才遇到了这个问题,在我的情况下,这是由于我已将数据从生产应用程序还原到本地副本,而该副本的生产版本中没有其他视图。还原时,导入了来自生产的数据(包括正确的模式),但我本地开发数据库中的最新模式仍包含一个视图,该视图由位于应用程序另一分支中的迁移创建。完全删除本地数据库,并重新运行开发数据库的全新副本上的pg_restore,删除了我所在的应用程序的分支不知道的视图。希望有所帮助。

0

我在为没有id列的'has through 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_keyproject_iduser_id,所以在模式:

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