В модели 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, если код когда-либо получит подвергается пользовательскому вводу в будущем.