2011-12-21 1 views
0

私の最初の問題は、これがまったく機能するのかどうか確信が持てないことです。しかし、私はすでにここで多くの助けを得ているので、少なくとも私は自分自身に尋ねようとします。アソシエーション別レコードの検索

ここで私が持っているのは、リレーションモデルを通してhas_many 'tasks'とhas_many 'checked_tasks'を持つモデル 'thesis'です。今私は仕事の数がchecked_tasksの数euqalsこれらの論文だけを持っています。

class Thesis < ActiveRecord::Base 
    has_many :tasks, :through => :relations 
    has_many :checkedtasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :relation 
end 

class CheckedTask < ActiveRecord::Base 
    belongs_to :thesis 
end 

私の最初のアイデアは、単にThesis.where(自己 .tasks.count == 自己 .checked_tasks.count)までにした - しかし、私はの代わりに使用するかを把握coudn't 自己を有効にしてください。

その後、私はそれをオットセイのスコープにしようとしましたが、それでも同じ問題が残っています。もしそうなら、私はいくつかの助けのために非常に感謝するだろう

+1

'CheckedTask'は完了とマークされたタスクですか? – jefflunt

答えて

1

あなたは

Thesis.joins(:checked_tasks, :tasks).group("thesis.id").select("thesis.*, count(distinct tasks.id) as task_count, count(distinct checked_tasks.id) as checked_count").having("checked_count = task_count") 

を行うことができます。しかしこれは、実行するクエリのかなりのブタです。論文のタスクのチェックを保存するために論文とタスクの間の結合モデルを使用して、一部のコメント者によって提案された線に沿ってデータモデルを再設計する必要があるように感じます。

+0

大丈夫です。私は、データモデルに余分なブール値フラグを追加するよりも、そうした方法を選択する方が良い解決策だと思っていました。とにかく、ありがとうございました! – m2dax

+0

だから、私が最初にやりたかったようなwhere節では、レコードそのものにアクセスすることができないということは、皆さんが言っていることでしょうか? – m2dax

+0

私が投稿したクエリは、あなたが試行しているものと同等でなければならず、むしろぎこちない –

1

CheckedTaskは、単にとしてマークされていたタスクである -

は、すべての後、私は「レールウェイ」を実行することがあるかどうかわかりませんコンプリート?そうだとすれば、なぜあなたはそれのために別のクラスが必要なのか分かりません。タスクはタスクであり、完了しているか完了していないかのどちらかです。あなたは、Taskモデルにscopeでのようなもの、これを行うことができるはず

にこの状態を追跡:

class Task < ActiveRecord::Base 
    scope :checked, lambda { where(:complete => true) } 

    ... 
end 

をしてcomplete呼ばtasksテーブルの上にboolean列がありますことを確認してください - それがなければなりませんタスクがまだ完了していない場合はfalse、タスクが完了した場合はtrueになります。 Thesisのためオフにチェックタスクのリストを取得するには

@thesis = Thesis.all.fist # <= the first Thesis in the DB 
@thesis.tasks.checked  # <= a collection of Task objects that have been checked 
+0

実際、その背後にはもう少しのものがあります。私はちょうどその方法を理解することがより簡単かもしれないと思った。タスク自体は、さまざまな種類の論文に使用できます。したがって、多くの論文に使用されているため、タスクにはブール値のフラグを設定することはできません。 – m2dax

+0

したがって、 'Task'と' CheckedTask'の目的は何ですか?アプリケーションでどのような概念が表現されていますか? – jefflunt

+0

すべての論文に**論文**が完成する前に完了しなければならない**課題**があります。また、各論文には** type **、thorughがあり、論文のタスクが定義されています。この関係は表**関係**に設定されます。結局のところ – m2dax

関連する問題