我在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循环哈希,但我不确定它是如何工作的。
答案 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