2015-07-19 47 views
0

是否可以在rails中使用用戶輸入的變量運行sql查詢?使用變量運行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"); 
} 

這造成我的所有選項,當我在JavaScript運行
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 =食品,L = lowerScore ...)。無論如何在軌道中這樣做?

回答

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

而且,不管你做什麼,千萬不要不使用在SQL查詢中使用用戶的輸入ActiveRecord接口。你將打開自己的SQL注入攻擊。見https://en.wikipedia.org/wiki/SQL_injection

+0

謝天謝地!我擔心它不能幹淨地完成。 我正在閱讀指南,但我想知道如何將用戶輸入存儲? html.erb頁面的用戶輸入是如何被推入變量的? – Akshay

+0

剛剛在這裏回答了這裏:http://stackoverflow.com/questions/31500096/how-to-perform-user-input-in-rails –

+0

如果答案適合你,你會介意接受它嗎? –