我想在某个列表中找到所有具有通用名称或内部名称的小部件query_list
。我可以
# Consider query_list = ["a","b","c"]
qlist = '(' + query_list.join(",") + ')'
# this makes
widgets = Widget.find_by_sql("SELECT * FROM widgets
WHERE common_name IN #{qlist} OR internal_name IN #{qlist}")
现在我有几个问题:
- 关于 SQL 注入攻击,上述 find_by_sql 是否安全?好像可以把危险的东西放进去
query_list
。- 怎么写
.find_by_sql(["SELECT * FROM widgets WHERE common_name IN ? OR internal_name IN ?", ["a","b","c"], ["a","b","c"] ])
- 如果它不安全,我们可以让它安全吗?
- 怎么写
- 如果没有必要,我宁愿不写原始 sql。我知道我们可以在 中写入
AND
条件find
,如在 中.find(:conditions=>{:internal_name => ['a','b','c'], :common_name => ['a','b','c']})
。我们也可以OR
用 find 写条件吗? - 怎么用
where
?这与使用有什么不同find
?