我正在解决的总体问题:
我对ruby很陌生,正在为我的应用程序创建一个搜索方法,在这个方法中,用户搜索一个模型foo的名称,foo可能有许多该名称的实例,我们返回另一个模型day的所有相关实例的结果。但是,每个foo都有与其关联的一天的多个版本(总共有4个不同的版本可以与之关联)。我们通过foo显示这些版本,foo将它们包含在booleans中: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.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

在我的控制器中,我调用返回结果的搜索方法,并将其分配给控制器中的局部变量results。
我还有一个数组,包含当前用户可以访问的所有可用天数。
微观目标:
我想得到一个集合或数组,它只是days_set的散列,其中day包含在available_days中。也就是说,如果我的天设置是
[{: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]

问题:
我怎样才能得到在我的日子里谁的日子是在可用的日子里?
我遇到了这个错误,无法将符号转换为整数,比任何其他错误都多,至少一周一次,也许更多。我觉得这表明了一些我不太理解的概念。你能告诉我这个概念是什么吗?这样我就可以查找关于它的信息和/或直接告诉我一些关于它的信息?我不知道我要找的是什么,所以很难找到它。
谢谢您。

最佳答案

获取您的工作日子集:

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](hash element:day的keyds值是一个符号,而available_days数组是一个整数数组。

关于ruby-on-rails - 基于Ruby中的哈希值从哈希集中选择一些哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17822332/

10-15 12:22