0

实际范围示例提供了传递给查询的硬编码参数的使用:

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 ?

谢谢你。

4

2 回答 2

1

当前实现仅适用于硬编码范围。一般来说,拥有动态范围与仅在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 流出模型之外(大部分情况下,哈哈)。

正如您所看到的,范围几乎不会给您带来任何影响,因为模型的内部实现可能会或可能不会使用范围,您将获得相同的结果。这种编码模式要好得多,因为:

  1. 您可以在模型上测试静态方法
  2. 您有可能具有保护语句的静态方法 if (department = null) throw new IllegalArgumentException("blah...")
  3. 您在具有良好语义名称的模型上具有静态方法
  4. 对您的表的实现和访问被包装在一个类中,而不是在外面流血(控制器)。
  5. 很容易在路上进行重构。

但是,如果您使用这种方法,则作用域的值接近于零。

不用说,我在工作中不使用范围。

于 2018-09-24T16:25:46.150 回答
0

我认为在您的 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将是您的范围值。

于 2018-10-23T14:09:30.647 回答