Ecto

naive_datetimeでなく、utc_datetime_usecを使用したほうが良いという話 https://elixirforum.com/t/why-use-utc-datetime-over-naive-datetime-for-ecto/32532

preload

交差テーブルでpreloadする方法は、

例えば、

def get_user_by_role(role_name) when is_binary(role_name) do
  from(u in User,
    join: ur in UserRole,
    on: ur.user_id == u.id,
    join: r in Role,
    on: r.id == ur.role_id,
    where: r.name == ^role_name,
    select: u
  )
  |> Repo.all()           # ここでselect1回走る
  |> Repo.preload(:roles) # ここでselect2回走る
end

あるいはこう、

def get_user_by_role(role_name) when is_binary(role_name) do
  from(u in User,
    join: ur in UserRole,
    on: ur.user_id == u.id,
    join: r in Role,
    on: r.id == ur.role_id,
    where: r.name == ^role_name,
    preload: :roles,
    select: u
  )
  |> Repo.all()           # ここでselect3回走る
end

selectを1回で済ましたい場合は、明示的に書く。 see. https://hexdocs.pm/ecto/Ecto.Query.html#preload/3

def get_user_by_role(role_name) when is_binary(role_name) do
  from(u in User,
    join: ur in UserRole,
    on: ur.user_id == u.id,
    join: r in Role,
    on: r.id == ur.role_id,
    where: r.name == ^role_name,
    preload: [roles: r]
    select: u
  )
  |> Repo.all()           # ここでselect1回走る
end