【问题标题】:Selecting Some Hashes From Set of Hashes Based On Value In Ruby根据 Ruby 中的值从一组哈希中选择一些哈希
【发布时间】:2013-07-23 05:45:01
【问题描述】:

我要解决的总体问题:

我对 Ruby 还是很陌生,正在为我的应用程序创建一个搜索方法,用户在该方法中搜索一个模型的名称 foo,它可能有许多该名称的实例,我们返回所有的结果另一个模型 Day 的相关实例。但是,每个 foo 都有多个与之关联的 day 版本(总共可以关联 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 是一个这样形成的集合

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。 我还有一个数组,包含 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}]

不工作的错误/问题/代码:

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

我认为这会起作用,但它会在标记为 ** 的行上生成 Can't convert Symbol to Integer 错误(代码中没有。)

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. 我一直遇到这个错误,Can't convert Symbol to Integer,比任何其他错误都多,至少每周一次,也许更多。我觉得这表明一些我不太理解的概念。你能告诉我这个概念是什么,以便我可以查找有关它的信息和/或指导我了解有关它的一些信息吗?我不知道我在找它叫什么,所以很难找到它。

谢谢。

【问题讨论】:

  • 您在为Set 使用 gem 吗?它不是标准的 Ruby 类。
  • @mbratch 它在Ruby Documentation 中,所以我假设它是一个标准的Ruby 类。
  • 啊,是的,你是对的。我的 irb 给了我一个错误,但我忘了需要 lib。
  • 对于对此投反对票的人,如果您也对原因发表评论,这将非常有帮助,这样我就可以学会提出更好的问题。谢谢。

标签: ruby-on-rails ruby hash enumerable


【解决方案1】:

获取您的日期子集:

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 数组是一个整数数组。

【讨论】:

  • 感谢您抽出宝贵时间帮助我。您的解决方案还给了我“无法将符号转换为整数”的错误。我想也许我不太明白符号和哈希的关系。 ds[:day] 不应该给我哈希 ds 的 :day 属性映射到的日期对象的 ID 号吗?即,由于在第一个散列中,:day=>d1,不应该在迭代第一个散列的散列时,ds[:day] 返回 d1?
  • @Magelet 很有趣。当我模拟您的场景时,它可以工作。但是我将整数值分配给d1d2 等。您的值是如何设置的? “符号”有点像一个常量字符串。它只是哈希元素的标签。你可以说:day => 3,或者你可以说"day" => 3,两者都可以在哈希中工作。但是,你所做的和我展示的一定有一些不同。例如,如果您有:day => d1,那么d1 是一个必须表示某种值的变量。我正在使用d1d2 等给出的测试场景。该示例在irb 中是否适合您?
  • d1、d2 等是我的 Day 模型/类的对象,而不是整数(尽管我认为当我将日期放入 day_set 时,请参阅问题的结构部分,其中 days_set形成后,真正放入的内容将是 id,它应该是一个整数?)。我会用 irb 中的整数来试一试,看看是否能澄清任何事情。
  • 感谢信息的帮助。您最初的问题陈述显示:day => d,但我没有看到d 已定义。我确定问题出在这个领域。在您的简化示例中,如果 d1 等设置为整数,则一切正常。因此,在您的现实生活示例中,您在一个地方有整数,但在另一个地方有符号,它们正在通过includes? 或其他方法进行比较。
  • 我想我可能已经弄清楚发生了什么。我正在从一系列班级酒吧中获得可用的日子。 Bar has_many days,所以看起来我在将 bar 对象映射到他们的日子时使用的技术不起作用,(available_bar.flat_map {|b| b.days}。至少,当我选择一天时,b .days 不起作用。我将不得不更多地研究关联,并弄清楚如何正确访问它。我认为这就是问题所在,可用的 days 数组很不稳定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2017-01-16
相关资源
最近更新 更多