从Ruby中基于值的哈希集合中选择一些哈希值

时间:2013-07-23 22:48:24

标签: ruby-on-rails ruby hash enumerable

我正在解决的整体问题:

我是Ruby的新手,正在为我的应用程序创建一个搜索方法,用户在其中搜索一个模型的名称foo,该模型可能有许多该名称的实例,我们返回所有结果另一个模型的相关实例,Day。但是,每个foo都有与之关联的多个版本的日期(总共可以关联4个不同版本。我们通过foo显示这些版本,foo包含它们在布尔值中:include_in_standard,include_in_v1等)。

我需要我的搜索方法让我知道每天包含哪些版本的foo,以便我可以相应地显示搜索结果。此外,只有特定日期可供不同类型的用户使用。我已经得到它,以便我将关于模型的日期和版本的信息传递给控制器​​,但是,在控制器中,我遇到的问题只是获得当前用户可用的日期。

守则的结构:

在Day的模型中,我有一个返回以下内容的搜索方法:

results={:result_case=>result_case, :days_set=>days_set, :term0=>term0, :term1=>term1}

result_case是一个整数,term0和term1是字符串。

days_set是一个像这样形成的Set

days_set=Set.new
array_of_foo.each do |f|
  f.join_table_connecting_foo_and_days.days.each do |foo|
    days_set+={:day=>d, :standard=>f.include_in_standard, :v1=>f.include_in_v1, :v2=>f.include_in_v2, :v3=>f.include_in_v3, :v4=>f.include_in_v4}
  end
end
days_set

在我的控制器中,我调用返回结果的搜索方法,并将其分配给控制器中的局部变量。 我还有一个可以访问current_user,available_days的所有日子的数组。

微目标:

我想得到一个集合或数组,它只是来自days_set的哈希值,其中的日期包含在available_days中。也就是说,如果我的days_set当前是

[{:day=>d1, :standard=>true, :v1=>false, :v2=>false, :v3=>true, :v4=>true},
  {:day=>d2, :standard=>false, :v1=>true, :v2=>false, :v3=>true, :v4=>false},
  {:day=>d3, :standard=>false, :v1=>false, :v2=>false, :v3=>true, :v4=>true},
  {:day=>d4, :standard=>true, :v1=>true, :v2=>true, :v3=>true, :v4=>true},
  {:day=>d5, :standard=>false, :v1=>false, :v2=>false, :v3=>true, :v4=>false},
  {:day=>d6, :standard=>true, :v1=>false, :v2=>true, :v3=>false, :v4=>true}]

available_days=[d1, d3, d4]

然后我想要

[{:day=>d1, :standard=>true, :v1=>false, :v2=>false, :v3=>true, :v4=>true},
  {:day=>d3, :standard=>false, :v1=>false, :v2=>false, :v3=>true, :v4=>true},
  {:day=>d4, :standard=>true, :v1=>true, :v2=>true, :v3=>true, :v4=>true}]

错误/问题/代码不起作用:

我已经尝试过寻找有关如何在其他地方执行此操作的想法,但我认为我没有编码词汇来描述我正在尝试做的事情。

我认为这会起作用,但它会在标记为**的行上生成无法将符号转换为整数错误(不在代码中。)

days_set=results[:days_set]
** new_days_set=days_set.keep_if{|day_hash| available_days.include? day_hash[:day]

问题:

  1. 如何在我的days_set中获取哈希值,其中的日期为available_days?

  2. 我一直遇到这个错误,无法将符号转换为整数,比任何其他错误都要多,至少每周一次,甚至更多。我觉得这表明了一些我不太了解的概念。你能告诉我这个概念是什么,所以我可以找到它的信息和/或指导我的一些信息吗?我不知道我在寻找什么,这很难找到它。

  3. 谢谢。

1 个答案:

答案 0 :(得分:3)

为了获得你的日子:

new_days = days_set.select { |ds| available_days.include? ds[:day] }

这会给你一个数组。或者您可以使用.to_set获取一组:

new_days_set = (days_set.select { |ds| available_days.include? ds[:day] }).to_set

“无法将符号转换为整数”错误正在发生,因为您可能正在尝试将符号(例如:day)与整数值(例如d1)进行比较。或者,如果ds[:day](哈希元素:day的键ds的值)是一个符号,而您的available_days数组是一个整数数组。