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

4 回答 4

3

我在 Category 和 Products 模型中添加了以下内容:

self.primary_key = :id 

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

于 2013-10-08T06:55:34.830 回答
0

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

于 2014-04-20T18:13:21.137 回答
0

我在为没有 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_keyproject_iduser_id,因此在模型中:

class Membership < ActiveRecord::Base
  self.primary_key = [:project_id, :user_id]
  belongs_to :project
  belongs_to :user
end
于 2014-05-11T14:43:27.860 回答
0

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

你这么说

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

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

我也有点困惑为什么该sku列被用作外键和主键,即使该表有一个 id 列。但看起来这种关系很好。

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

于 2013-10-06T13:29:41.357 回答