我在Rails 4和SQLite3上使用ruby。我想使用列=>值组合的哈希查询表/模型。给定哈希值:
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或空白的实例。因此,值"Option 1" => "Yes"
应保留A8786-01以及该列中所有其他空白部分。换句话说,将取消A8786-02。上面显示的哈希将返回部件
["A1234", "A8786-01"]
。可以用一种方法完成吗?还是一连串的作用域?我愿意采取任何好的方法。我以为这可能包括使用a.each遍历Hash,但是我不确定它如何工作。
最佳答案
基本的where
方法:
attrs = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"}
Part.where(attrs)
返回
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
关于ruby-on-rails - 在Rails中使用ruby中的哈希表查询/过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284287/