Я создал объединенную таблицу для этой цели.Вот код:
class CreateCategoriesProductsJoin < ActiveRecord::Migration
def self.up
create_table 'categories_products', :id => false do |t|
t.column 'category_id', :integer
t.column 'product_id', :integer
end
end
def self.down
drop_table 'categories_products'
end
end
Модель продукта:
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
attr_accessor :new_category_name
before_save :create_category_from_name
def create_category_from_name
create_category(:name => new_category_name) unless new_category_name.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" %>
or create one:
<%= f.text_field :new_category_name %>
</p>
Я пытаюсь загрузить категории в поле выбора, но получаю сообщение "неопределенный метод` category_id 'для # ".
Я не понимаю, почему?Я также попробовал с has_many: через, но то же самое произошло.
Я должен быть в состоянии вывести категории таким образом, поскольку они связаны, но я нет.Есть идеи?
Я попробовал скринкаст с railscast.com, но не повезло.Вы имеете в виду полный учебник / пример с категорией продукта, ассоциациями подкатегории?Я еще не нашел нисходящего (за исключением Railscast, но это не работает для меня).
Большое спасибо за ваше время и спасибо за труд, который потребовался вам, чтобы ответить (еслиВы сделали).
Редактировать: Я нашел проблему, которая была в модели продукта.Вот исправление:
class Product < ActiveRecord::Base
belongs_to :category
def category_name
category.name if category
end
def category_name=(name)
self.category = Category.find_by_name(name) unless name.blank?
end
end
Редактировать 2: У меня также есть другая проблема с категориями.
Имя категории не отображается в представлении.Я вызываю функцию category_name, но ничего не получаю взамен.Вот так (show.html.erb):
<p>
<label for="product_category_id">Category:</label><br />
<%= f.collection_select :category_name, Category.find(:all), :id, :name, :prompt => "Select a Category" %>
or create one:
<%= f.text_field :new_category_name %>
</p>
Или (show.html.erb):
<td><%= product.category_name %></td>
Я попытался изменить на has_and_belongs_to_many :categories
и, по крайней мере, я получилназад "Категория" как название странное ... потому что у меня 4 категории.
Продукты принадлежат только к одной категории.
PS: Опять же, спасибо за ваше время.