是否有一种优雅的方式来按哈希映射排序?

时间:2014-05-14 14:01:42

标签: ruby-on-rails ruby sorting hash

我的哈希标记有编号的问题(the keys),还有五个可能的答案(the values)

questions = {
  likert_1:  %w(choice_5mMP0CMR9tC choice_6kUil9z7wi4 choice_6ZQQ7c2KR3O choice_6ilb652FCqZ choice_6Z3NYElYPPM),
  likert_2:  %w(choice_5pjBFzoqqpc choice_6AARUgqxvGL choice_5lnoEM7GUYr choice_5inpB7UT9Bs choice_6N6ETdSVpFP)
}

数据库按用户保存,每个问题一个值。因此,数据库可以具有每个likert_#一个值的任意组合。 但是!数据库不会按照答案的顺序保存它们。

因此,我试图找到一种优雅的方式,根据likert_1

之前的订单likert_2排序任何给定的两个回复

所以,如果我有:[choice_5pjBFzoqqpc choice_5mMP0CMR9tC]。然后,它们应按以下方式退回:[choice_5mMP0CMR9tC, choice_5pjBFzoqqpc],因为choice_5mMP0CMR9tC中显示likert_1choice_5pjBFzoqqpc中显示likert_2

1 个答案:

答案 0 :(得分:1)

正如我也指出的那样,在查询中进行排序而不是之后检索答案可能会更有效,更优雅。由于您有Answer和(可能)Question表,以及AnswerQuestion之间的关系,您只需在查询中的所需Question属性上订购使用ORDER BY。

说完了;既然您询问了如何根据提供的Array中的问题顺序排序Hash包含答案,而且还没有人回答,我会回答这个问题。

这里的简单想法是找到包含答案作为其中一个选项的问题的索引,并将该索引用作sort_by属性。您可以通过以下方式执行此操作:

answers = ["choice_5pjBFzoqqpc", "choice_5mMP0CMR9tC"]

question_choices = questions.values
sorted = answers.sort_by { |a| question_choices.find_index { |c| c.include? a } }
# ["choice_5mMP0CMR9tC", "choice_5pjBFzoqqpc"]