2013-10-06 3 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 используется как внешний ключ и первичный ключ, хотя таблица имеет столбец идентификатора. но похоже, что это соотношение отлично работает.

Единственная причина, по которой я знаю (возможно, намного больше) для ошибки ActiveRecord::UnknownPrimaryKey, является то, что в одной из таблиц модели отсутствует столбец идентификатора, но обе категории и продукты, похоже, имеют одно из того, что вы пишете ,

+0

Да, это была опечатка, я создал представления для всех необходимых данных. Я установил sku в качестве основного и внешнего ключа в ассоциации «orders», потому что заказы связаны с продуктами через sku, а не с идентификатором продукта. Я попытался удалить эту связь, но это не изменило результат. Да, категории и продукты имеют столбцы идентификаторов, хотя они не являются первичными ключами в строгом смысле слова, поскольку представления не имеют первичных ключей. – andreobrown

0

Я сейчас столкнулся с этой проблемой, и в моем случае это произошло из-за того, что я восстановил данные из производственного приложения в локальную копию, у которой были дополнительные представления, отсутствующие в производственной версии. При восстановлении данные (включая правильную схему) из производства были импортированы, но более поздняя схема, которую я имел в моей локальной разработке db, по-прежнему включала представление, которое было создано миграцией, которая проживала в другой ветке приложения. Полное удаление локальной базы данных и повторное использование pg_restore в новой копии базы данных разработки удалило представление, в котором находится ветка приложения, о котором я нахожусь, о котором не известно. Надеюсь, это поможет.

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_key как к project_id и user_id, так и в модели:

class Membership < ActiveRecord::Base 
    self.primary_key = [:project_id, :user_id] 
    belongs_to :project 
    belongs_to :user 
end 
Смежные вопросы