使用collection_select显示唯一的结果

时间:2017-07-07 21:26:19

标签: ruby-on-rails ruby

我对教授进行了一系列评论,希望用户能够根据所教授的课程对评论进行排序。我有一个collection_select,但是我在筛选重复项时遇到了麻烦,例如,如果有多个用户拥有#34;英语"你会看到"英语"在列表中两次。

这就是我所拥有的:

<%= collection_select(:professor, :id, Review.where(professor_id: @professor.id), :id, :whatclass) %>

我已经看到一些解决方案说我应该添加.uniq,但这似乎没有做任何事情。

<%= collection_select(:professor, :id, Review.where(professor_id: @professor.id).uniq, :id, :whatclass) %>我很确定这不起作用,因为它指的是Review.id而不是Review.whatclass

1 个答案:

答案 0 :(得分:0)

您的列表包含重复项,因为它包含每个评论的条目,而不是每个课程的条目,这对于每个评论都不是唯一的。我甚至不确定您是否需要使用collection_select来呈现一个简单的唯一类名列表。

在控制器中,尝试:

@unique_classes = Review.
  where(professor_id: @professor.id).
  pluck(:whatclass).uniq

此处,pluck会返回教授每次评论的whatclass属性数组。在其上调用uniq将删除数组中的任何重复项。如果您对每位教授都有很多评论,那么通过让数据库过滤重复项,您可以获得更好的表现:

@unique_classes = Review.
  where(professor_id: @professor.id).
  pluck("DISTINCT whatclass")

这将生成SELECT DISTINCT查询,因此数组pluck返回已经是唯一的。

最后,您可以将此whatclass值数组插入一个简单的select_tag

select_tag :class_name, options_for_select(@unique_classes)

上面的代码未经测试,因此可能需要进行一些更改才能正常工作。