Имя поля переменной в named_scope?

В модели 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] }
}

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

Используя ход мыслей Eggdrop, я пошел с:

@@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-инъекций, если код когда-либо будет раскрыт пользователю. ввод в будущем.


person nitecoder    schedule 26.05.2009    source источник


Ответы (1)


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

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

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

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

person eggdrop    schedule 26.05.2009
comment
В настоящее время я рассматриваю использование белого списка полей и создание исключения, если поле отсутствует в нем. - person nitecoder; 26.05.2009
comment
Да, я думаю, мы говорим об одном и том же. - person eggdrop; 26.05.2009
comment
Круто, это то, что кто-то еще, с кем я говорил, тоже предложил. Кажется, это лучший путь прямо сейчас. Спасибо :) - person nitecoder; 26.05.2009