【问题标题】:Splitting an Array in Ruby在 Ruby 中拆分数组
【发布时间】:2013-04-04 22:51:28
【问题描述】:

我正在从我的 ruby​​ 文件中的数据库中获取一些数据,如下所示:

@main1= $connection.execute("SELECT * FROM builds 
                WHERE   platform_type LIKE 'TOTAL';")

@main2= $connection.execute("SELECT * FROM builds 
                WHERE   platform_type NOT LIKE 'TOTAL';")

完成此操作后,我正在对这些结果执行散列和一堆其他东西。需要明确的是,这不会返回一个数组,而是返回一些 mysql2 类型的对象。所以我只是将它映射到 2 个数组以确保安全:

@arr1 = Array.new
@arr1 = @main1.map

@arr2 = Array.new
@arr2 = @main2.map

有什么方法可以避免执行 2 个不同的查询,并通过只执行一个查询来获得 2 个不同数组中的所有结果。我基本上想将结果分成 2 个数组,第一个具有 platform_type = TOTAL,其他所有内容都在另一个中。

【问题讨论】:

  • 你说你在使用 Rails,但你没有使用 ORM?有什么特别的原因吗?你的@arr = Array.new 电话也是多余的。

标签: ruby-on-rails ruby ruby-on-rails-3 mysql2


【解决方案1】:

另外,在不了解你为什么要做你正在做的事情的情况下,我会使用 Enumerable#partition 这样的:

rows = $connection.execute('SELECT * FROM builds')
like_total, not_like_total = rows.partition { |row|
  row['platform_type'] =~ /TOTAL/
}

请注意,IIRC,SQL LIKE 'TOTAL' 与 Ruby 的 "string" =~ /TOTAL/ 不同(更像是 SQL 中的 LIKE '%TOTAL%' — 不确定您需要什么)。

【讨论】:

    【解决方案2】:

    回答你的问题,而不去解释你为什么这样做:

    在一个查询中将它们全部返回,使用额外的条件,然后您可以使用 group_by 对它们进行任意分组:

    all_results = $connection.execute("SELECT *, platform_type LIKE 'TOTAL' as is_like_total FROM builds").

    这将为您的每个结果提供一个“is_like_total”“列”,您可以对其进行分组。

    http://ruby-doc.org/core-2.0/Enumerable.html#method-i-group_by

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 2021-03-23
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多