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

时间:2012-04-27 13:05:34

标签: ruby-on-rails ruby

我有两个对象,即食谱&成分。
我用

创建了它们
rails generate scaffold ingredient id:integer name:string
rails generate scaffold recipe id:integer name:string 

我也希望用n:m关系创建它们(多对多) 我该怎么做?我应该创建一个不同的脚手架吗? 感谢。

3 个答案:

答案 0 :(得分:10)

不,您需要通过迁移生成连接表。

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

答案 1 :(得分:5)

这是一个很棒的教程,展示了两种使用many_to_many关系的方法:http://railscasts.com/episodes/47-two-many-to-many

答案 2 :(得分:4)

您可以执行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

,反之在models/recipe.rb

has_and_belongs_to_many :ingredients