2016-11-21 7 views
0

子供が多い親クラスがあります。子供たちは、重要な時刻情報をdate_time列に保持します。子どもがすべて私が定義している必要な基準を満たしている場合にのみ、親レコードを選択する方法min(children.start_time) > ? AND min(children.start_time) < ?, Time.now, Time.now.end_of_month + 2.monthPostgreSQLで特定の条件を満たしているすべての関連する子に基づいて親を選択する方法

私はすべての誤ったデータを返してきた多くのソリューションを試しました。私が試したものの一例:

Parent.where(is_active: true).joins("LEFT JOIN children ON parents.id = children.parent_id").group("parents.id").group("children.start_time").having("min(children.start_time) > ? AND min(children.end_time) < ?", Time.now, Time.now.end_of_month + 2.month) 

このクエリでは、子供たちは私が後だものではありませんどのTime.nowより前の日付を開始した両親を私に戻っています。

いずれのポインタも大歓迎です。

答えて

1

答えは次のとおりです。

Parent.where(is_active: true).joins(:children).group("parents.id").having("min(children.start_time) > ? AND min(children.end_time) < ?", Time.now, Time.now.end_of_month + 2.month) 
0

これはmergeメソッドを使用するのに最適な時間です。

を開始するには - あなたの子供のクラスでscope作成:それは本当に両方の規準にminであるべき

scope(:near_start, -> { where('min(start_time) > ? AND min(start_time) < ?, Time.zone.now, 2.months.from_now) }) 

を(

Parent.joins(:children).merge(Child.near_start) 

は私がテストするために何か良い例を持っていないのですか?今、私はあなたはそれがすべての子どもをチェックすることを保証するために必要なものは100%わからない、私はそれがgroupおよび/またはhavingで行うことができることを推測する。

私はそれが少しあなたを導くことができることを願っています。

+0

ありがとうございました。私は 'グループ'と '持っている'とそれを理解しました。 Rubyで後で操作するよりも、DBでクエリを実行するほうがパフォーマンスが優れています。また、Postgresはそれが次のエラー 'PGを与える...あなたはどこで、分混在させません:: GroupingError:ERROR:集約関数は、私の例では何もルビーで処理されないであろうWHERE' – rorykoehler

+0

で許可されていない、またはあなたが何をしましたか平均?私はPostgresで多くの集約関数を使用していません。うまくいくと助かりました – davidwessman

+0

マージはRubyハッシュクラスのメソッドです。 はFYI:私はちょうどそれをベンチマークし、私は私の答えに掲載DBでの直接クエリは、提案マージ方式のアプローチよりも、ほぼ4倍高速です。 – rorykoehler

関連する問題