Ruby w / Postgres & Sinatra - запрос не будет правильно с параметром? - PullRequest
0 голосов
/ 30 апреля 2010

Итак, я установил переменную в своем основном файле ruby, которая обрабатывает все мои сообщения и получает запросы, а затем использует шаблоны ERB для фактического отображения страниц. Я передаю сам обработчик базы данных в шаблоны erb, а затем запускаю запрос в шаблоне, чтобы получить все (для этого примера) гранты.

В моем основном рубиновом файле:

grants_main_order = "id_num"
get '/grants' do
    erb :grants, :locals => {:db=>db, :order=>grants_main_order, :message=>params[:message]}
end

В шаблоне erb:

db = locals[:db]
getGrants = db.exec("SELECT * FROM grants ORDER BY $1", [locals[:order]])

Это приводит к некоторому очень случайному упорядочению, однако, если я заменю $ 1 на id_num, это будет работать как надо.

Это проблема с печатанием? Как я могу это исправить? Использование замены строки с # {locals [: order]} также дает странные результаты.

Ответы [ 3 ]

1 голос
/ 23 марта 2013

Параметры для ввода постоянных значений в запрос. Это возможно и законно, но не имеет смысла использовать их в ORDER BY -пункте.

Скажем, вы хотите выполнить этот запрос:

SELECT first_name, last_name
  FROM people
 ORDER BY first_name

Если вы поместите «first_name» в строку и передадите его в качестве параметра, вы получите:

SELECT first_name, last_name
  FROM people
 ORDER BY "first_name"

Разница огромна. Этот последний ORDER BY -класс действительно говорит базе данных не заботиться о значениях столбцов для каждой строки, а просто сортировать, как если бы все строки были идентичны. Порядок сортировки будет случайным.

0 голосов
/ 30 апреля 2010

Вы проверяли, что такое locals[:order]? Может быть, там что-то необычное.

p locals[:order]

0 голосов
/ 30 апреля 2010

Я бы порекомендовал использовать datamapper (http://datamapper.org/) для sinatra. Это очень изящный ORM и обрабатывает параматеризованные запросы, которые вы пытаетесь построить достаточно хорошо.

...