2013-10-06 54 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 
相關問題