如何在创建rails连接表后链接表单

时间:2012-07-03 15:08:29

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

您在我的Rails 3.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)如何设置我的产品表单,以便在填写Categories text_field时,它将更新我刚创建的连接表。我从products表中删除了categories列。

2)我这样做的全部原因是因为我最初在一个字段中有多个类别ID,需要将它们分解,以便我可以轻松地执行不同的计数等。用户需要能够为每个产品添加多个类别,如何告诉Rails保存添加到数据库中新行的每个类别?

1 个答案:

答案 0 :(得分:2)

产品可以有多个类别,而类别可以引用多个产品,对吧?如果是这样,你想创建第三个关联表,我们称之为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。如果您想要完整的说明,this Guide是一个可以开始的地方。