当前实现仅适用于硬编码范围。一般来说,拥有动态范围与仅在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 流出模型之外(大部分情况下,哈哈)。
正如您所看到的,范围几乎不会给您带来任何影响,因为模型的内部实现可能会或可能不会使用范围,您将获得相同的结果。这种编码模式要好得多,因为:
- 您可以在模型上测试静态方法
- 您有可能具有保护语句的静态方法
if (department = null) throw new IllegalArgumentException("blah...")
- 您在具有良好语义名称的模型上具有静态方法
- 对您的表的实现和访问被包装在一个类中,而不是在外面流血(控制器)。
- 很容易在路上进行重构。
但是,如果您使用这种方法,则作用域的值接近于零。
不用说,我在工作中不使用范围。