Установление отношения has_many в Rails - PullRequest
1 голос
/ 02 декабря 2009

У меня проблемы с созданием приложения в Rails.

Это приложение имеет две модели, одну для представления компаний, а другую для представления продуктов. Каждая компания продает ноль или более продуктов, и я собираюсь зафиксировать эти отношения в модели. Вот что у меня так далеко:

Я создал модели, запустив генератор:

script/generate scaffold company name:string product_id:integer

script/generate scaffold product name:string

Я добавил следующую строку в модель компании, чтобы показать, что каждая компания может иметь несколько продуктов:

has_many :products

Я добавил следующую строку в модель продукта:

belongs_to :company

Я создал несколько примеров данных в файлах YAML. Пример данных для компаний:

microsoft:
  name: Microsoft
  product_id: [1, 3]

google:
  name: Google
  product_id: [2, 4]

И пример данных для продуктов:

word:
  id: 1
  name: Word

earth
  id: 2
  name: Earth

excel:
  id: 3
  name: Excel

chrome:
  id: 4
  name: Chrome

Затем я загрузил пример данных:

rake db:fixtures:load

Затем я пытаюсь распечатать все продукты для компании в представлении компании:

<% if @company.product_id %>
<% for product in @company.product_id %>
  <tr>
    <td><%=h product.name %></td>
  </tr>
<% end %>
<% end %>

Здесь я получаю сообщение об ошибке. Есть идеи? Я не уверен, в чем проблема. Насколько я знаю, это может быть связано с тем, как я генерировал модели или устанавливал их отношения. Или это может быть из-за того, как я пытаюсь распечатать информацию в представлении.

Ответы [ 2 ]

7 голосов
/ 02 декабря 2009

Во-первых, у вас неправильно настроены поля. has_many и belong_to требуют, чтобы это было products с company_id, а не наоборот. Для отношения «один ко многим» внешний ключ всегда должен быть помещен в «многие» части уравнения.

И тогда вы хотите это вместо:

<% for product in @company.products %>
  <tr>
    <td><%=h product.name %></td>
  </tr>
<% end %>
0 голосов
/ 04 декабря 2009

Вы не говорите, в чем ваша ошибка, но я считаю, что ваш файл yml не совсем верен.

В прошлый раз, когда я проверял, это было невозможно:

microsoft:
  name: Microsoft
  product_id: [1, 3]

product_id: «список» будет принимать только «теги» -> Word, Excel. Но тогда он сгенерирует "странные" идентификаторы (используя хэши строк тегов). Так что это тоже не будет работать очень хорошо.

И, как говорили другие, будет намного проще, если вы добавите client_id в продукты. Это просто, как работают базы данных.

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