0

私は一日中この作業を行ってきましたが、結果は少し醜いです。確かにもっと良い方法があるはずですが、ほぼ確実に、私はそれについて知りません。

私はモデルを持っています-Task、has_many (または none!) TimeLogs

今までインスタンス メソッドを使用して、開始されたかどうかを確認していましたか? または !started?

  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 に答える