Продукты - Категории ассоциации. (редактировать) принадлежит_, есть_и_отмены_в_мани? - PullRequest
0 голосов
/ 06 сентября 2010

Я создал объединенную таблицу для этой цели.Вот код:

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: Опять же, спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 15 января 2018

Попробуйте следующее:

<%= f.select :category_ids, Category.pluck(:name, :id), { prompt: "Select a Category" }, multiple: true %>

Не забудьте разрешить category_ids, то есть: params.require(:product).permit(category_ids: [])

0 голосов
/ 06 сентября 2010
<%= f.collection_select :category_id ... %>

Эта строка ищет .category_id в объекте формы, который имеет методы доступа, зависящие от объекта, для которого была создана форма (я предполагаю, что это объект продукта). Объект продукта имеет атрибуты для отношения has_and_belongs_to_many с категорией, но это не один идентификатор категории. Доступные методы перечислены здесь . Я не уверен, потому что я никогда не использую has_and_belongs_to_many, но я думаю, что вы захотите

<%= f.collection_select :categories_singular_ids ... %>

collection_select должен быть мультивыбором, поэтому для html вам понадобится :multiple => true в последнем хэше опций.

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