2015-07-19 2 views
0

Можно ли запускать SQL-запросы с введенными пользователем переменными в рельсах?Рельсы, выполняющие sql-запросы с переменными

Im пытается найти базу данных для ресторанов с определенными характеристиками, которые они ищут (например, кухня, оценка, местоположение в почтовом индексе). Вот мой 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"); 
} 

Это создает все мои варианты и когда я бег
var x = document.getElementById("frm1"); в JavaScript, я могу получить значения пользователя вставленные для их поиска.

В моей модели я пытаюсь создать инструкцию SQL, которая будет принимать пользовательские входы и проходить через базу данных и собирать их.

т.е.

sql = "select * from restaurant, inspection 
        where restaurant.rid = inspection.rid 
        and cuisine ='#{c}' 
        and totalscore > '#{l}' 
        and totalscore < '#{h}' 
        and zipcode = '#{z}'" 

#{x} предназначается, чтобы быть пользователей переменных (т.е. с = кухня, л = 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

Если ответ будет работать, вы не могли бы его принять? –

Смежные вопросы