Ruby on Rails - n:m多对多关系

问题描述:

我有两个对象,即配方&成分。
我一直在使用Ruby on Rails - n:m多对多关系

rails generate scaffold ingredient id:integer name:string 
rails generate scaffold recipe id:integer name:string 

我想太多了N新建他们创造他们:M关系(很多到很多)。
我该怎么做?我应该创建一个不同的脚手架吗? 谢谢。

不,您需要创建一个连接表,通过生成一个迁移。

rails g migration ingredients_recipes ingredient_id:integer recipient_id:integer 

然后,您可以添加到您的模型:

Ingredient.rb

has_and_belongs_to_many :recipe 

Recipe.rb

has_and_belongs_to_many :ingredients 

或者,如果要添加其他属性的连接(例如数量),那么你可以为它生成一个模型。

rails g model ingredients_recipes ingredient_id:integer recipient_id:integer 
+0

是有办法的时候我已经创建了最初的支架做呢? – Jeb 2012-04-27 15:00:21

+0

它创建了一个空的rb文件,只包含 - def up end def down end。 – Jeb 2012-04-27 15:27:22

这里是一个伟大的教程,显示使用MANY_TO_MANY关系的两种方法:http://railscasts.com/episodes/47-two-many-to-many

可以执行rails generate migration create_join_table_ingredient_recipe ingredient recipe,这将产生一个迁移文件,您可以修改包括索引和外键,如:

class CreateJoinTableIngredientRecipe < ActiveRecord::Migration 
    def change 
    create_join_table :ingredients, :recipes do |t| 
     t.index [:ingredient_id, :recipe_id] 
     t.index [:recipe_id, :ingredient_id] 
    end 
    add_foreign_key :ingredients_recipes, :ingredients 
    add_foreign_key :ingredients_recipes, :recipes 
    end 
end 

然后你就可以添加在models/ingredient.rb

has_and_belongs_to_many :recipe 

反之:

has_and_belongs_to_many :ingredients