0

我花了一整天的时间来完成这项工作,对我来说,结果有点难看。当然必须有更好的方法,几乎​​可以肯定,我不知道。

我有一个模型 - 任务,它有很多(或没有!)时间日志

直到现在我用一个实例方法来判断它是否启动了?或!开始?

  def started?
    time_logs.length > 0
  end

但是在创建范围时,我发现我无法将此方法实现到查询中。如果有办法,我真的很想知道,因为我遇到了一些类似的问题。

我解决这个问题的方法是通过连接将其重构为适当的数据库范围:

 scope :started, joins(:time_logs).uniq  

很漂亮,反过来呢?

scope :not_started, joins("LEFT OUTER JOIN time_logs ON tasks.id = time_logs.task_id").where("time_logs.task_id is null")

布莱尔。确定不是吗?

它可以工作,但我一直希望我会遇到一个 NOT 运算符,它会返回第一个范围没有返回的所有内容,或者“Task.all - Task.started”类型的解决方案。

4

1 回答 1

2

我真的不认为有任何更好的解决方案,但是这应该具有良好的性能:

scope :not_started, where("ID NOT IN (SELECT task_id FROM time_logs)")
于 2012-08-10T13:24:40.770 回答