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