Рельсовая ассоциация не работает - PullRequest
0 голосов
/ 08 февраля 2011

Я даже не знаю, с чего начать, чтобы объяснить мою проблему, поэтому, пожалуйста, потерпите меня :(!

У меня есть две модели; Продукт и категория - Продукт has_one Категория и категория принадлежит_ продукту

Модель продукта

id
имя
описание
марка
продавец
цена
изображение
ссылка
категория


Категория модели

id
name
product_id


Хорошо, теперь я перебираюXML-лента создает такие продукты:

Product.create(:name => node.xpath("./text/name/text()").inner_text.downcase, 
               :description => node.xpath("./text/desc/text()").inner_text,
               :brand => node.xpath("./brand/text()").inner_text,
               :merchant => node.xpath("../@name").inner_text,
               :category => Category.find_by_name(node.xpath("./cat/text()").inner_text.downcase),
               :price => "£" + node.xpath("./price/btext()").inner_text)

Кажется, это работает отлично, пока я не посмотрю на то, что он производит в базе данных ... Вот вывод из обеих таблиц.

Таблица продуктов
(сокращенная версия, содержит более 10 000 записей)

id: 1
....
....
....
Категория: <-- пусто для всех 10 000+ записей ... err wtf? Конечно, должен быть идентификатор категории или имя </p>

Таблица категорий
(содержит только 8 записей, по одной для каждой категории)

яd: 1
имя: носки
product_id: 10662 <---- err wtf? <br>

id: 2
имя: комбинации
product_id: 10658<---- err wtf? <br>

id: 3
name: shoes
product_id: 9954 <---- err wtf? <br>

id: 4
имя: ночное белье
product_id: 10653 <---- err wtf? <br>

id: 5
имя: шляпы
product_id: 10655 <---- err wtf? <br>

id: 6
имя: шорты
product_id: 10221 <---- err wtf? <br>

id: 7
имя: джинсы
product_id: 9973 <---- err wtf? <br>

id: 8
name: trainers
product_id: 8072 <---- err wtf? <br>

Если честно, я так растерялся, я не уверен, что хочу увидеть больше: - /

Я просто хочу связать две таблицы, смеется.Я что-то упустил здесь??

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Необходимо внести пару изменений.Во-первых, структура вашей модели должна выглядеть следующим образом:

class Product
  belongs_to :category
end

class Category
  has_many :products
end

Во-вторых, ваша таблица продуктов должна иметь category_id, а не категорию, а ваша таблица категорий не должна иметь product_id вообще.Ваш пример кода должен работать правильно.

1 голос
/ 08 февраля 2011

При использовании has_one / принадлежит только одна моделей в конечном итоге содержит идентификатор другой.В вашем случае, поскольку Category belongs_to Product, таблице categories требуется столбец product_id, в котором будет храниться идентификатор продукта, которому она принадлежит.

Но если Product has_one Category (это также относитсяна has_many), ему не нужен столбец category_id - Rails знает, что для поиска категории (c) для данного продукта (p) он может просто просмотреть categoriesтаблица для категории, где product_id == p.id.

Из кода, который вы опубликовали, похоже, что Rails делает то, что должен - даже если связь доступна из обеих моделей, только модель, имеющаяДиректива belongs_to содержит любые данные отношений, хранящиеся в ее таблице.На самом деле Rails достаточно умен, чтобы знать, что когда вы задаете опцию {: category => cat} при создании продукта, он должен фактически изменить таблицу categories - и это так.Вот почему вы видите product_id s в вашей таблице categories и ничего в вашей таблице products (а столбец products.category даже не должен существовать - без него отношения будут работать нормально).

С учетом сказанного, Я подозреваю, что Продукт должен иметь возможность принадлежать более чем к одной Категории, и, аналогично, Категория должна иметь возможность содержать более одного Продукта.В этом случае вы захотите использовать has_and_belongs_to_many в в обеих моделях и создать таблицу соединений categories_products для их соединения ...

Надеюсь, это очиститвсе наверх!

1 голос
/ 08 февраля 2011

Ваши отношения в обратном направлении.Если вы хотите, чтобы товар был в одной категории, вам нужно:

Товар
belongs_to :category

Категория
has_many :products

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...