虽然我不是一个完整的Ruby / Rails newb,但我仍然很绿,我正在试图弄清楚如何构建一些模型关系。我能想到的最简单的例子是烹饪“食谱”的想法。
配方由一种或多种成分和每种成分的相关数量组成。假设我们在数据库中有所有成分的主列表。这表明了两个简单的模型:
class Ingredient < ActiveRecord::Base
# ingredient name,
end
class Recipe < ActiveRecord::Base
# recipe name, etc.
end
如果我们只想将食谱与成分相关联,那就像添加适当的belongs_to
和has_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
答案 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
怎么样:
这不仅仅是Rails方式,而是在数据库中建立一个更多的关系。它并非真正的“拥有并且属于许多”,因为每种配方每个配方只有一个计数,每个配方每个配料一个计数。这是相同的数量。