ActiveJDBC: использовать область с динамическими параметрами
В реальных примерах области показано использование жестко закодированных параметров, передаваемых в запрос:
public class Employee extends Model {
static {
addScope("byDepartment", "department = 'marketing'");
}
}
Можно ли сделать этот параметр динамическим и весь объем виден следующим образом:
public class Employee extends Model {
static {
addScope("byDepartment", "department = '?'");
}
}
Пример использования:
Employee.scope("byDepartment").where(....) <-- how to pass in a department value ?
Спасибо.
2 ответа
Текущая реализация работает только с жестко заданными областями. В целом наличие динамических областей ничем не отличается от наличия дополнительного параметра в where()
метод, но значительно усложнит реализацию.
Этот вопрос побуждает к некоторому философскому обсуждению. Обычно вы используете модель в качестве собственного сервиса. Другими словами, использование такой модели извне модели не является предпочтительным способом:
List<Employee> employees = Employee.scope("byDepartment").where("start_date > ?", startDate);
Лучше всего обернуть все доступ к EMPLOYEES
стол в Employee
класс как это:
public class Employee extends Model{
public static List<Employee> getStartedByDepartment(Date started, String department){
return Employee.scope(department).where("start_date > ?", started);
}
}
Мы кодируем все проекты JavaLite с этим шаблоном и не разрешаем ActiveJDBC API отбирать внешние модели (по большей части, lol).
Как вы можете видеть, мало что даст вам области, так как внутренняя реализация модели может или не может использовать области, вы получите те же результаты. Этот шаблон кодирования намного лучше, потому что:
- У вас есть статические методы на моделях, которые вы можете проверить
- У вас есть статические методы, которые могут иметь защитные операторы
if (department = null) throw new IllegalArgumentException("blah...")
- У вас есть статические методы на моделях с хорошими семантическими именами
- Реализация и доступ к вашей таблице обернуты в один класс, а не стерты снаружи (контроллеры).
- Легко сделать рефакторинг в будущем.
Тем не менее, если вы используете этот подход, значение областей будет близко к нулю.
Само собой разумеется, я не использую области в своей работе.
Я не вижу ничего плохого в том, чтобы сделать параметр динамическим, как в вашей модели Employee:
public class Employee extends Model {
static {
addScope("byDepartment", "department = '?'");
}
}
проблема на самом деле с
Employee.scope("byDepartment").where(....)
рядом с scopeName, scope()
не предоставляет никакого способа для дополнительных параметров для scopeValue(s).
Вместо этого вы можете позвонить Employee.where(subquery, params)
где subquery
будет вашей областью видимости, к которой вы можете получить доступ ModelDelegate.getScopes().get(scopeName)
а также params
будет вашей областью видимости.