有很多——关于Rails的困境有很多,通过不同类型的关系



我在使用has_many,:through时陷入了两难境地。

假设我试图通过Rails对餐厅的菜单进行建模。假设这家餐馆可以有几种不同的菜单,这取决于食物的种类。

例如,我们有早餐的菜单,午餐的菜单,等等。我们还想添加添加儿童菜单和成人菜单等功能。

显然,我们应该有一个Menu和一个Food类,我们还需要一个连接表来指定不同的菜单和它们之间的HABTM关系。

但是我们如何处理餐型呢?
注意,一个膳食类型belongs_to许多食物,但只属于一个菜单。我觉得将它添加到前一个连接表中效率很低。

在这个例子中,我想我可以通过创建一个新模型MealType来解决这个问题,并写一个Food has_many:meal_types,:through meals。

然后更新Menu模型,因为一个Menu只能有一种膳食类型。这意味着我将与每个菜单的MealTypes有一个has_one关系。简要:

食品类:

has_many Menus, :through menu_food_join_table  
has_many MealTypes, :through meals  

菜单类:

has_many Foods, :through menu_food_join_table  
has_one MealType  

MealType class:

belongs_to Foods, :through meals  
belongs_to Menus  

我陷入了两难境地:这段代码很糟糕,至少对我来说是这样。对于这样一个简单的关系,使用几个表似乎不太实际。我认为我不应该在Foods中添加一个MealType字段,因为有些食物可能会出现在几餐中(比如可乐)。

我也不应该在菜单中添加一个MealType,因为我也希望能够根据膳食类型来区分食物(例如,如果我想只显示某些膳食中允许的食物)。

在这种情况下你会怎么做?我必须承认我没有太多的面向对象设计经验,这就是我来这里的原因。


我的最终解决方案

这是我选择的解决问题的方法:

由于我的真正目标是通过算法生成菜单,并且由于在这项工作中我不需要保存任何生成的菜单,因此我销毁了Menu模型并创建了一个Meal模型。

然后,我通过一个连接表向Food模型添加了一个多餐关系。在膳食数据库中唯一的东西是我想要能够创建的膳食类型(早餐,午餐,晚餐等)。在同一个联接表中,一个meal包含多个food。

我仍然有菜单控制器和视图,我用它们来创建MenuFactory。

这个MenuFactory是一个标准的工厂模式,它占用了我想为餐厅生成菜单和特定算法的天数(例如,餐厅只提供少于300卡路里的盘子),并吐出了整个菜单。剩下的就是简单的编程。

你似乎把事情弄得太复杂了。你有一家餐厅,它有一份早餐菜单,一份午餐菜单,一份晚餐菜单。这只是三个菜单——我认为你根本不需要对类型进行建模。

所以你只需要

菜单:has_many段

菜单项:belongs_to菜单

我想你可能会争辩说,一个菜单项目可以在多个菜单上,就像早餐项目在午餐菜单上一样——但是如果你不需要弄得那么复杂,那就不要。

如果你想用菜单做的事情比这更复杂,那么我建议你的主要问题是你还没有真正定义好问题是什么,你已经开始尝试建立一个数据库来表示你还没有明确定义的东西

最新更新