Каково ваше соглашение для определения сложных запросов SQL в Rails? - PullRequest
5 голосов
/ 01 января 2009

Я довольно новичок в Rails, и мне было любопытно, что некоторые соглашения используют эксперты, когда им нужно создать очень сложный SQL-запрос, содержащий много условий. В частности, сохраняя код читаемым и поддерживаемым.

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

Одна строка, в вызове для поиска ():

@pitchers = Pitcher.find(:all, "<conditions>")

Используйте предопределенную строку и передайте ее:

@pitchers = Pitcher.find(:all, @conditions)

Использование закрытой функции-члена для возврата запроса

@pitchers = Pitcher.find(:all, conditionfunction)

Я склоняюсь к соглашению о закрытой функции-члене, кроме того, потому что вы можете передать параметры для настройки запроса.

Есть мысли по этому поводу?

1 Ответ

7 голосов
/ 01 января 2009

Я почти никогда не передаю условия find. Обычно эти условия было бы полезно добавить к вашей объектной модели в виде named_scope или даже просто метода класса в модели. Именованные области видимости хороши тем, что их можно объединить в цепочку, что немного усложняет задачу. Они также позволяют передавать параметры.

Кроме того, вы почти никогда не должны просто передавать необработанную строку условия SQL. Вы должны использовать либо стиль хеша (:conditions => { :name => 'Pat' }), либо стиль массива (['name = ?', 'Pat']). Таким образом, SQL экранируется для вас, предлагая некоторую защиту от атак SQL-инъекций.

Наконец, я думаю, что подход, который вы рассматриваете, когда вы пытаетесь создать условия в любом контексте, который вы называете find, является ошибочным подходом. Задача модели - предоставить интерфейс, через который будет возвращен соответствующий ответ. Попытка определить условия для передачи в вызов find слишком близка к базовой реализации, если вы спросите меня. Кроме того, это сложнее проверить.

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