在Ruby on Rails中,尊重多对多关系中的赋值顺序



我目前正在开发一个Rails应用程序,它运行两个模型:RecipesCategories。它们都通过has_and_belongs_to_many关系相关联。

在Recipes表单中,用户可以添加两个不同的类别(第一个将是主要类别,第二个将是次要类别)。

为了达到这个目的,我在控制器中添加了以下代码(在相应的视图中,它们都是分别名为category[0]和category[1]的下拉菜单):
categories = params[:category]
categories.each do |c|
   @recipe.categories << Category.find_by_id(c)
end 

虽然这段代码可以工作,但它并没有像我预期的那样工作,因为关联是通过id排序构建的(例如,如果主类别的id=3,次类别的id=1,它们的顺序将总是改变)。

在使用<<操作符时,是否有一种方法来指示所需的顺序?有什么修改建议吗?

我不认为你可以使用has_and_belongs_to_many控制排序。就我而言,我不喜欢使用这种推荐信,因为它有一点灵活性。

我更喜欢(并建议你)使用"正常"模型/表来连接RecipeCategory。这个模型(CategoryRecipe)可以有额外的字段,如position或额外的标志,如main。这样会给你带来很多好处。

Rails的has_and_belongs_to_many关联(实际上是所有Rails关联类型)并不是设计为保持顺序的。但是,您可以使用acts_as_list gem将此功能添加到关联中。

使用acts_as_list和has_many实现有序的has_and_belongs_to_many关联的示例可以在这个问题的答案中找到。

最新更新