是否可以在rails中使用用户输入的变量运行sql查询?
我试图在数据库中搜索他们正在寻找的具有某些特征的餐馆(即美食,分数,邮政编码位置)。这是我的html.erb作为参考。
<form id="frm1" action="form_action.asp">
Name: <input type="text" name="name" value="Antico Pizza"><br>
Lower Score: <input type=integer name="LowerScore" value=0>
Higher Score: <input type="integer" name="HigherScore" value=100><br>
Zipcode: <input type=integer name="Zipcode" value=30332><br>
<label for="Cuisine">Cuisine: </label>
<select name="Cuisine" id="Cuisine">
<%= @my_cuisines.each do|cuisine|%>
<option value=<%= cuisine.cuisine %> onclick="getCuisine()"><%= cuisine.cuisine %></option>
<% end %>
</select>
</form>
<button onclick="myFunction()">Search!</button>
<p id="demo"></p>
<script>
function myFunction() {
var x = document.getElementById("frm1");
}
这会创建我的所有选项,当我运行时
{j}中的var x = document.getElementById("frm1");
,我可以获取用户为其搜索插入的值。
在我的模型中,我正在尝试创建一个SQL语句,它将接受用户输入并通过数据库并收集它们。
即
sql = "select * from restaurant, inspection
where restaurant.rid = inspection.rid
and cuisine ='#{c}'
and totalscore > '#{l}'
and totalscore < '#{h}'
and zipcode = '#{z}'"
#{x}
意味着用户变量(即c = cuisine,l = lowerScore ...)。无论如何在rails中这样做了吗?
答案 0 :(得分:2)
当然!您可以使用ActiveRecord的查询界面(Arel)。
Restaurant.joins(:inspection).where(cuisine: c, zipcode: z, totalscore: l..h)
请注意,您需要在餐厅和检验模型之间建立关联。
class Restaurant < ActiveRecord::Base
has_many :inspections, foreign_key: 'rid'
end
class Inspection < ActiveRecord::Base
belongs_to :restaurant, foreign_key: 'rid'
end
我建议您阅读有关这些主题的Rails指南:
http://guides.rubyonrails.org/association_basics.html http://guides.rubyonrails.org/active_record_querying.html
此外,无论您做什么,在不使用ActiveRecord接口的情况下,不要在SQL查询中使用来自用户的输入。您将打开自己的SQL注入攻击。见https://en.wikipedia.org/wiki/SQL_injection