ruby-on-rails - 在 Ruby 中根据值从哈希集中选择一些哈希

标签 ruby-on-rails ruby hash enumerable

我正在解决的总体问题:

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

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

代码结构:

在 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

在我的 Controller 中,我调用返回结果的搜索方法,并将其分配给 Controller 中的局部变量 results 。 我还有一个当前用户可以访问的所有日期的数组,可用日期。

微观目标:

我想获取一个集合或数组,它只是 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. 我遇到过这个错误,无法将符号转换为整数,比任何其他错误都多,至少每周一次,也许更多。我觉得这表明了一些我不太理解的概念。您能告诉我这个概念是什么,以便我可以查找有关它的信息和/或指导我找到有关它的一些信息吗?我不知道我要找的东西叫什么,所以很难找到它。

谢谢。

最佳答案

要获取您的天数子集:

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] (哈希元素 ds 的键 :day 的值)是一个符号,并且您的 available_days array 是一个整数数组。

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

相关文章:

arrays - 如何在Perl中访问哈希数组?

objective-c - 使用 HMAC256 在 C# 和 Objective-C 中进行等效哈希

ruby - 创建哈希的快捷方式

javascript - Rails4 表单动态只读字段

ruby-on-rails - Rails 4 - 在 View 中显示来自不同模型的值

ruby-on-rails - 计算 Rails 中记录之间的平均天数

ruby - Ruby On Rails 中的 Elasticsearch 从 0.90 升级到 2.x

ruby 数量相等?

ruby-on-rails - Ruby on Rails has_many通过自引用跟随/从属关系

ruby - 为什么使用过程而不是方法?