范围中的类方法或外连接

时间:2012-08-10 13:02:23

标签: ruby-on-rails ruby-on-rails-3.2

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

我有一个模型 - 任务,has_many(或没有!)TimeLogs

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

  def started?
    time_logs.length > 0
  end

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

我解决这个问题的方法是使用join来将其重构为适当的数据库范围:

 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")

bleaurgh。当然不是吗?

它有效,但我一直希望我会遇到一个NOT运算符,它会返回第一个作用域没有的东西,或者是一个“Task.all - Task.started”类型的解决方案。

1 个答案:

答案 0 :(得分:2)

我真的不认为有更好的解决方案,但这应该有很好的表现:

scope :not_started, where("ID NOT IN (SELECT task_id FROM time_logs)")