Имя переменной поля в named_scope? - PullRequest
3 голосов
/ 26 мая 2009

В модели Rails я пытаюсь получить named_scope, который фильтрует значения start_date и end_date. Это просто. Но мне придется делать это во многих различных областях во многих случаях.

Это напрашивается на неприятности? Если так, то почему (SQL-инъекция?) И есть ли другой способ добиться этого.

named_scope :between, lambda {|start_date, end_date, field|
  { :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date] }
}

РЕДАКТИРОВАТЬ: Используемое решение

Используя образ мыслей Эггропда, я выбрал:

@@valid_fields = %w(fields in here)

named_scope :between, lambda{ |start_date, end_date, field_name|
  field = (@@valid_fields.include?(field_name)) ? (field_name) : raise (ActiveRecord::StatementInvalid)
  {  :conditions => ["#{field} >= ? AND #{field} <= ?",  start_date, end_date]}
}

Теперь я могу повторно использовать мой named_scope для полей, которые я хочу отфильтровать по диапазону дат, не переписывая, по существу, одну и ту же область видимости снова и снова и заносить в белый список имена полей, чтобы избежать путаницы с именами моих столбцов и хитрым внедрением SQL, если код когда-либо получит подвергается пользовательскому вводу в будущем.

1 Ответ

4 голосов
/ 26 мая 2009

Возможно, вы могли бы написать метод в вашей модели для проверки 'field':

Если таблица x, тогда 'field' должно быть конкретным существующим полем даты в этой таблице.

Другими словами, вы не разрешаете внешний ввод непосредственно в 'поле' - внешний ввод должен соответствовать известным атрибутам и определенным условиям, указанным в вашем методе проверки.

Однако в целом это общее направление не рекомендуется.

...