【问题标题】:Search a table for two matching values using a hash in Ruby on Rails在 Ruby on Rails 中使用哈希在表中搜索两个匹配值
【发布时间】:2015-05-31 20:11:33
【问题描述】:

我有以下哈希

{ "1" => "a", "2" => "a", "3" => "2"}

以及以下名为 ITEMS 的 sqlite3 表:

POSITION   CODE   NAME    VALUE
"1"        "a"    "Cat"   "Small"
"1"        "b"    "Cat"   "Big"
"2"        "a"    "Fish"  "Red"
"2"        "b"    "Fish"  "Blue"
"3"        "1"    "Car"   "Fast"
"3"        "2"    "Car"   "Slow"

我想查询表并返回格式为 {"NAME" => "VALUE"} 的哈希。

输入哈希的格式为 {"POSITION" => "CODE"},因此上面哈希中的第一个值的位置为“1”,代码为“a”,这将返回名称“Cat”和“值”小的”。真实版本的初始哈希值是 20 个值,并且表中的记录接近 200 条。

上面的示例哈希应该返回:

{ "Cat" => "Small", "Fish" => "Red", "Car" => "Slow" }  

【问题讨论】:

  • 你试过了吗?

标签: ruby-on-rails ruby search sqlite


【解决方案1】:

这是一些代码:

Item.where("(POSITION = ? AND CODE = ?) OR
            (POSITION = ? AND CODE = ?) OR
            (POSITION = ? AND CODE = ?)", *hash.flatten
          )
     .select("name, value")
     .map { |rec| [rec.name, rec.value] }.to_h

更新

作为@mudasobwa said

Item.where((["(POSITION = ? AND CODE = ?)"] * hash.size).join(' OR '), hash.flatten)
    .select("name, value")
    .map { |rec| [rec.name, rec.value] }.to_h

这是一个很棒的提示。我太喜欢了。

【讨论】:

  • 如果我的字符串长度不同,where 查询是否必须更长?
  • @sabrams Humm.. 我不知道 SQLite3 DB 有什么更好的选择.. :(
  • @sabrams (["(POSITION = ? AND CODE = ?)"] * hash.size).join(' OR '), hash.flatten 可以解决问题。请注意,扁平数组前面的 splat 是多余的。
  • 更新你的答案然后:)
  • @mudasobwa 当然.. 为什么不.. :)
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2013-03-02
  • 2012-12-18
  • 2015-05-30
相关资源
最近更新 更多