принадлежат к ассистентской помощи has_many - PullRequest
1 голос
/ 06 сентября 2010

Я создал объединенную таблицу для категории моделей и продуктов (оба созданы с помощью scaffold). Модель продукта это:

class Product < ActiveRecord::Base
  belongs_to :category 

  def category_id
    category.id if category
  end

  def category_id=(id)
    self.category = Category.find_by_id(id) unless id.blank?
  end
end

и модель категории это:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products
end

В форме form.html.erb я создаю выпадающий список со всеми классами, которые пользователь может выбрать:

<p>
      <label for="product_category_id">Category:</label><br />
      <%= f.collection_select :category_id, Category.find(:all), :id, :name, :prompt => "Select a Category" %>
</p>

Все же, когда я смотрю на показ продукта:

<p>
  <b>Category:</b>
  <%= @product.category_id %>
</p>

или список продуктов (index.html.erb):

<td><%= product.category_id %></td>

Там нет категории. Просто пусто Я не понимаю Что-то не так с методом category_id или ассоциацией?

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Во-первых, вам не нужны явные методы category_id и category_id=. ActiveRecord справится с вами для ассоциации belongs_to.

Во-вторых, кажется, что существует несоответствие между тем, хотите ли вы ассоциацию has_and_belongs_to_many или has_many / belongs_to. Если у вас есть таблица соединения, то у вас есть первая, и в этом случае обе стороны ассоциации должны быть объявлены с has_and_belongs_to_many. Если вы просто используете category_id в таблице продуктов, тогда другой конец вашей ассоциации по категории должен быть has_many :products.

с моделью соединения:

class Categorization < ActiveRecord::Base
  belongs_to :category
  belongs_to :product
end

вы бы определили в своем Product классе:

has_many :categorizations
has_many :categories, :through => :categorizations

Тогда, поскольку ваша ассоциация является ассоциацией «многие», вы не получаете метод .category для продукта. Однако вы получаете метод categories (плюс еще несколько методов - посмотрите документацию has_many). Если вы назовете свой collection_select category_ids, то он должен работать как положено. Вы также можете добавить опцию «несколько» для выбора, чтобы выбрать более одной категории.

0 голосов
/ 06 сентября 2010

Ваша ассоциация явно неверна. Как уже указывалось, в категории has_many продукты. И если вы хотите использовать отношение «многие ко многим», вам настоятельно рекомендуется использовать отношение has_many: through.

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