在rails上使用ruby中的哈希表查询/过滤器

时间:2015-03-26 16:48:55

标签: ruby-on-rails ruby search hash sqlite

我在rails 4和SQLite3上使用ruby。我想使用Column =>的哈希查询表/模型。价值组合。鉴于哈希:

 a = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"}

和表格PARTS:

PART     SIZE     TYPE     MATERIAL    OPTION 1     OPTION 2
A1234    1        Tall     
A1233    2        Tall
A1232    3        Tall
A1231    4        Tall
A8787                      Plastic
A8786-01                   Metal       Yes
A8786-02                   Metal       No
A8785                      Liquid
A6543                                                Yes

我希望查询查看每一列,并返回包含散列中给出的值的所有Parts,以及包含nil或blank的任何实例。因此,值"Option 1" => "Yes"应保留A8786-01以及该列中所有其他空白部分。或者换句话说,A8786-02将被淘汰。

上面显示的哈希将返回部件["A1234", "A8786-01"]。这可以用一种方法完成吗?还是一串范围?我愿意接受任何好的方法。我认为这可能包括使用a.each循环哈希,但我不确定它是如何工作的。

1 个答案:

答案 0 :(得分:2)

基本where方法:

attrs = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"}
Part.where(attrs)

为每个属性返回{strong>完全匹配每个给定值的Part条记录。


另一种方法:

attrs = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"}
sql_query = attrs.map { |col, val| "(parts.#{sanitize(col)} = #{sanitize(val)} OR pars.#{sanitize(col)} IS NULL)" }.join(" AND ")
Part.where(sql_query)

返回Part记录匹配每个给定值或具有NULL(但不是空字符串""对于给定列< /强>

我已经在这里看到了一个漏洞:它会返回Part个记录,每个“想要的值”都有NULL个值。例如:

# consider this dummy data
# PART     SIZE     TYPE     MATERIAL    OPTION 1     OPTION 2
# A1234    1        Tall     
# A1233

attrs = { "Size" => 1, "Type" => "Tall" }
sql_query = attrs.map { |col, val| "(parts.#{sanitize(col)} = #{sanitize(val)} OR pars.#{sanitize(col)} IS NULL)" }.join(" AND ")
Part.where(sql_query)
# will returns A1234 AND A1233 records