mix phx.gen.~を使うと、RailsのActiveRecordチックに、ModelとDBアクセッサ関数を自動生成してくれるが、DBアクセッサ関数のみだと、非効率なselectにしてしまうケース…たとえば、get_xxxxx()で毎回1行ずつ取り出してロジック側でループしてしまうバッドパターンがRails同様にあるし、joinやgroup_by等はDBアクセッサ関数でフォローされないため、自由にSQLを書きたいニーズがある
そういうときは、以下のようなEctoの使い方をすればOK
sql = "select * from hoge inner join foo on hoge.customer_id = foo.customer_id"
{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
以下のように関数化しておくと便利かも知れない
def query( sql ) when sql != "" do
{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
result
end
Repoの指定が、固定だと困る場合は、モジュールを引数渡しするか、Agentに持たせる等で工夫する