By setting an application-wide (or schema module specific) Ecto.Repo
variable, your code doesn't have to mention the repo over and over (see here for setup instructions).
# Regular Ecto
MyRepo.get_by(Post, title: "My post")
# Endon
Post.find_by(title: "My post")
Let's say you want to make a Post
with a title, unless it already exists in which case you want to just retrieve the record. Ecto doesn't make this easy, because you have to build your own transaction:
MyRepo.transaction(fn ->
Post
|> MyRepo.get_by(Post, title: "My post")
|> case do
nil ->
MyRepo.insert!(%Post{title: "My post"})
post ->
post
end
end)
Endon makes it easy:
Post.find_or_create_by(title: "My post")
All of the Endon
functions that act as selects can either take a Ecto.Query
or a list of equality conditions. For instance, to see if any records exist with a given title:
# Regular Ecto
query = from p in Post, where: p.title == "My post"
Repo.exists?(query)
# Endon
Post.exists?(title: "My post")
You can even pass in Ecto.Query
s:
query = from p in Post, where: p.like_count > 10
Post.exists?(query)
Endon makes preloading easy!
# Regular Ecto
Post |> MyRepo.get_by(id: 1) |> MyRepo.preload(:comments)
# Endon
Post.find_by(id: 1, preload: comments)
Want to get the first or last n
records? Easy:
# Ecto
# There's no short equivalent in Ecto, Ecto.Query.last gives only 1 record
# Endon
Post.last(10)
Post.last(1, conditions: [author_id: 3])
# Ecto
# There's no short equivalent in Ecto, Ecot.Query.first gives only 1 record
# Endon
Post.first(3)
Post.first(1, conditions: [author_id: 3])
Want to get a bunch of records given their ids?
# Ecto
MyRepo.all(from p in Post, where: p.id in [1,2,3])
# Endon
Post.find([1, 2, 3])