Ruby on Rails строит запрос по частям - PullRequest
3 голосов
/ 22 сентября 2011

Раньше был очень похожий вопрос, но я все еще борюсь.Можно ли построить запрос поэтапно?Допустим, у меня есть поисковая форма с большим количеством текста и выбранными полями, которые могут быть связаны и / или могут быть пустыми.Таким образом, оператор sql должен состоять из нескольких частей, которые связаны индивидуально для каждого поиска.Я пытался создать строки для каждого параметра и поместить их в символ?(я имею в виду @options) и поместите это в предложение where (например, Product.where (@options)).Это работает как-то, но у меня есть проблемы с этой частью: 'params [: query]', когда она в кавычках.Либо в моем выражении sql говорится «выбирайте продукты из продуктов, где (имя например params [: запрос]»), либо, если я попробую # {params [: запрос]}, в нем говорится: выберите продукты из продуктов (где «имя» нравится ».)

Так, как я могу связать различные части запроса?

Я жду ваших ответов!

1 Ответ

8 голосов
/ 22 сентября 2011

Никогда, когда-либо , когда-либо вставляйте необработанные строки в ваш SQL.Это очень плохая форма.Вы всегда должны использовать механизм побега, предоставляемый Rails, или что-то подобное, чтобы избежать серьезных неприятностей.Вставка содержимого из params очень опасна и никогда не должна выполняться, так как для этого нужно просто обнулить ваше приложение: { :query => '\"-- DROP TABLE users;' }

Как правило, вы используете вспомогательные методы , предоставленные ActiveRecord для сборкиПошаговый запрос:

scope = Product

if (params[:query].present?)
  scope = scope.where([ 'name LIKE ?', "%#{params[:query]}%" ])
end

if (params[:example].present?)
  scope = scope.where(:example => true)
end

@products = scope.all

Вы можете создать его поэтапно, каждый раз изменяя область действия на месте, а затем выполнить последний вызов, чтобы получить его.Как правило, именно тогда вы используете свой paginator, чтобы разделить результаты.

Это нормально, если вы добавите почти все в ваши параметры, потому что это должно быть экранировано к моменту достижения фазы SQL, как и все, что находится на стороне HTML.также экранируется для вас.

Не путайте переменные экземпляра, такие как @options, с символом, подобным :query.Это очень разные вещи.Переменные экземпляра имеют преимущество в автоматическом распространении на ваше представление, поэтому они часто широко используются в контроллерах.Представления должны по возможности избегать их изменения в зависимости от стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...