1

そのため、データを取得するために重要な SQL を必要とするデータベースから多くのグラフ/分析を描画しています。生の SQL をたくさん書いて v1 を完成させたので、今度はこれを Arel に変換したいと思います。

多くのクエリには、繰り返されるコードの大きなブロックがあります。Lists簡単な例として、特定の のすべてについてデータを取得したいことがよくありOrgます。アレルでは、これは次のとおりです。

loads_of_other_arel.where(lists_table[:org_id].eq(@org.id))

の繰り返しを次のように因数分解したいとlists_table[:org_id].eq(@org.id)思います。

loads_of_other_arel.filter_lists_by_org

これは次の方法で実行できます。

def filter_lists_by_org arel
  arel.where(lists_table[:org_id].eq(@org.id))
end

を呼び出しfilter_lists_by_org(loads_of_other_arel)ますが、これは非常に手続き的なようであり、優れた OO プログラマーとして行うべきことではありません。したがって、既存の Arel クラスのいくつかを開いて、それらにいくつかのメソッドをモンキー パッチする必要があるようです。これはよりOOですが、やり過ぎのように感じます-これを行うことを考えるべきですか、それともすべての方法でArelを繰り返すべきですか?

4

1 に答える 1

1

私は通常、これにスコープを使用します。これは不自然な例です:

scope :filtered_by_org, ->(org_id) {where(lists_table[:org_id].eq(org_id))}

loads_of_other_arel.filtered_by_org(@org.id)

ドキュメントを読むと、ポイントを理解するのに役立ちます。

于 2013-06-14T15:20:23.713 に答える