我在使用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
答案 0 :(得分:2)
我使用了以下类别和产品模型的附加功能:
self.primary_key = :id
我猜测rails无法识别用于关联的主键,因为我正在使用视图,而视图没有键。
答案 1 :(得分:0)
我有很多问题,评论中没有足够的空间,所以我只想写一个答案。
你说那个我正在使用现有数据库,并为所有数据创建模型 需要,将列映射到rails命名约定。
你的意思是你在数据库中创建VIEWS以将事物映射到rails命名约定吗?
我也有点困惑,为什么sku
列被用作外键,而主键是因为表具有id列。但看起来这种关系很好。
我知道(可能还有更多)ActiveRecord::UnknownPrimaryKey
错误的唯一原因是其中一个模型表缺少一个id列,但两个类别和产品似乎都有一个你写的是什么。
答案 2 :(得分:0)
我刚才遇到了这个问题,在我的情况下,这是因为我已经将数据从生产应用程序恢复到本地副本,该副本具有生产版本中不存在的其他视图。在还原时,导入了生产中的数据(包括正确的模式),但是我在本地开发数据库中使用的最新模式仍然包含一个视图,该视图是由位于应用程序另一个分支中的迁移创建的。完全删除本地数据库,并在开发数据库的新副本上重新运行pg_restore删除了视图,我所在的应用程序的分支并不知道。希望有所帮助。
答案 3 :(得分:0)
我在为一个&#39;创建连接表时遇到了这个问题。没有id列的关系。
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_id
和user_id
,因此在模型中:
class Membership < ActiveRecord::Base
self.primary_key = [:project_id, :user_id]
belongs_to :project
belongs_to :user
end