状況
PhoenixFrameworkのmodelを書いている時に、引数があるときだけupdated_at
の指定時間より新しいレコードを取得したかった。しかし、あとからwhere句を追加する方法が情報として少なかったのでメモとして残す。
環境
Elixir 1.3.0
Ecto 1.1.8
解決方法
from/2
にqueryを入れた変数を直接渡す。
サンプル
仮で下記modelがあると想定する。(PhoenixFrameworkを利用した場合のmodel)
defmodule App.Post do
use App.Web, :model
schema "posts" do
field :title, :string
field :body, :string
field :published, :boolean
field :deleted, :boolean
field :published_at, :datetime
timestamps
end
end
引数がtrueだった場合に、from p in base_query
の箇所で元のqueryにwhere句の条件を動的に追加している。
def all(published \\ false) do
base_query = from p in App.Post,
where: p.deleted == false
query = if published do
from p in base_query,
where: p.published == true
else
base_query
end
query
|> App.Repo.all()
end
まとめ
ここまで書いた後でQiitaを見ていたらこちらにしっかりとした情報が載っていた・・・もっと色々なクエリのサンプルが見たい方は参考までに。
とある事情でEcto 2.0が利用できない環境なので、今後はEcto 2.0もキャッチアップしてEctoの理解をもっと進めたい。