2

こんにちは、私のRails3.1アプリに次のような製品モデルがあります。

+----------------+---------------+------+-----+---------+----------------+
| Field          | Type          | Null | Key | Default | Extra          |
+----------------+---------------+------+-----+---------+----------------+
| id             | int(11)       | NO   | PRI | NULL    | auto_increment |
| type           | text          | YES  |     | NULL    |                |
| title          | text          | YES  |     | NULL    |                |
| description    | text          | YES  |     | NULL    |                |
| price          | text          | YES  |     | NULL    |                |
| img_src        | text          | YES  |     | NULL    |                |
| source         | text          | YES  |     | NULL    |                |
| sr_id          | text          | YES  |     | NULL    |                |
| categories     | text          | YES  |     | NULL    |                |
+----------------+---------------+------+-----+---------+----------------+

次の移行を使用してCategories_Productsを作成しました(モデルを作成しませんでした)。

class CreateCategoriesProducts < ActiveRecord::Migration
  def change
    create_table :categories_products, :id => false do |t|
      t.references :product
      t.text :categories
      t.timestamps
    end
  end
end

1)カテゴリtext_fieldに入力すると、作成した結合テーブルが更新されるように、製品フォームを設定するにはどうすればよいですか。製品テーブルからカテゴリ列を削除しました。

2)これを行った理由は、最初は1つのフィールドに複数のカテゴリIDがあり、それらを分割して、個別のカウントなどを簡単に実行できるようにする必要があったためです。ユーザーは製品ごとに複数のカテゴリを追加できる必要がありますが、データベースの新しい行に追加された各カテゴリを保存するようにRailsに指示するにはどうすればよいですか?

4

1 に答える 1

3

製品には複数のカテゴリを含めることができ、カテゴリは複数の製品を参照できますよね?その場合は、3番目の関連付けテーブルを作成し、それを呼び出してproduct_categories、標準のRailsイディオムを使用してサポートします。

# file: app/models/product.rb
class Product < ActiveRecord::Base
  has_many :categories, :through => :product_categories
  has_many :product_categories, :dependent => :destroy
end

# file: app/models/category.rb
class Category < ActiveRecord::Base
  has_many :products, :through => :product_categories
  has_many :product_categories, :dependent => :destroy
end

# file: app/models/product_category.rb
class ProductCategory < ActiveRecord::Base
  belongs_to :product
  belongs_to :category
end

...そしてあなたのテーブル/移行:

# file: db/migrate/xxx_create_products.rb
class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      ... 
      t.timestamps
    end
  end
end

# file: db/migrate/xxx_create_categories.rb
class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.string :name
      t.timestamps
    end
  end
end

# file: db/migrate/xxx_create_product_categories.rb
class CreateProductCategories < ActiveRecord::Migration
  def change
    create_table :product_categories do |t|
      t.references :product
      t.references :category
      t.timestamps
    end
  end
end

このようにして、「製品ごとに複数のカテゴリを追加する」ことが簡単になります。

my_product.categories.create(:name => "toy")

これにより、「toy」という名前のカテゴリと、my_productとその新しいカテゴリを関連付けるProductCategoryが作成されます。完全な説明が必要な場合は、このガイドから始めることができます。

于 2012-07-03T16:19:53.223 に答える