Rails:has_many有更多细节吗?

时间:2010-01-19 17:36:52

标签: ruby-on-rails activerecord has-many has-many-through

虽然我不是一个完整的Ruby / Rails newb,但我仍然很绿,我正在试图弄清楚如何构建一些模型关系。我能想到的最简单的例子是烹饪“食谱”的想法。

配方由一种或多种成分和每种成分的相关数量组成。假设我们在数据库中有所有成分的主列表。这表明了两个简单的模型:

class Ingredient < ActiveRecord::Base
  # ingredient name, 
end

class Recipe < ActiveRecord::Base
  # recipe name, etc.
end

如果我们只想将食谱与成分相关联,那就像添加适当的belongs_tohas_many一样简单。

但是,如果我们想将其他信息与该关系联系起来呢?每个Recipe都有一个或多个Ingredients,但我们想要指出Ingredient的数量。

Rails建模的方式是什么?它是否与has_many through

一致
class Ingredient < ActiveRecord::Base
  # ingredient name
  belongs_to :recipe_ingredient
end

class RecipeIngredient < ActiveRecord::Base
  has_one :ingredient
  has_one :recipe
  # quantity
end

class Recipe < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :ingredients, :through => :recipe_ingredients
end

2 个答案:

答案 0 :(得分:5)

食谱和配料有一个属于许多关系,但你想存储链接的附加信息。

基本上你正在寻找的是一个丰富的连接模型。但是,has_and_belongs_to_many关系不够灵活,无法存储您需要的其他信息。相反,你需要使用has_many:通过relatinship。

这就是我设置它的方式。

食谱栏目:说明

class Recipe < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :ingredients, :through => :recipe_ingredients
end

recipe_ingredients列:recipe_id,ingredient_id,数量

class RecipeIngredients < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :ingredient
end

成分列:名称

class Ingredient < ActiveRecord::Base
  has_many :recipe_ingredients
  has_many :recipes, :through => :recipe_ingredients
end

这将提供您要做的事情的基本表示。您可能希望向RecipeIngredients添加验证,以确保每个配方列出每个成分一次,并使用回调将重复项折叠到一个条目中。

答案 1 :(得分:0)

http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M001888&name=has_and_belongs_to_many

http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M001885&name=has_many

怎么样:

  1. 类成分(属于配方,有许多成分配方)
  2. 类食谱(含有许多成分,有许多成分配方)
  3. class IngredientRecipeCount(属于成分,属于食谱)
  4. 这不仅仅是Rails方式,而是在数据库中建立一个更多的关系。它并非真正的“拥有并且属于许多”,因为每种配方每个配方只有一个计数,每个配方每个配料一个计数。这是相同的数量。