Slide 1

Slide 1 text

elixir atlanta meetup

Slide 2

Slide 2 text

meetup.com/ atlantaelixir @vanstee

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

• speakers • sponsors • twitter • website • github org • [your great idea]

Slide 5

Slide 5 text

elixir and ecto

Slide 6

Slide 6 text

Elixir is a functional, meta-programming aware language built on top of the Erlang VM.

Slide 7

Slide 7 text

elixir-lang/elixir @josevalim

Slide 8

Slide 8 text

defmodule Hello do IO.puts "Before world defined" def world do IO.puts "Hello World" end IO.puts "After world defined" end Hello.world HELLO.EX

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Types

Slide 11

Slide 11 text

# tuple { :a, :b, :c } # list [1, 2, 3] [a: 1, b: 2, c: 3] # record defrecord User, name: "", age: nil User.new(name: "Patrick", age: 25) TYPE.EX

Slide 12

Slide 12 text

Pattern Matching

Slide 13

Slide 13 text

# assignment a = 1 # => 1 # matching 1 = a # => 1 2 = a # => ** (MatchError) ... { ^a, b } = { 1, 2 } # b => 2 [head | _] = [1, 2, 3] # head => 1 PATTERN.EX

Slide 14

Slide 14 text

case { 1, 2, 3 } do { 4, 5, 6 } -> "This won't match" { 1, x, 3 } when x > 0 -> "This will match and assign x" _ -> "No match" end GUARD.EX

Slide 15

Slide 15 text

Processes

Slide 16

Slide 16 text

current_pid = self spawn fn -> current_pid <- :hello end receive do :hello -> IO.puts "Hello World" end PROCESS.EX

Slide 17

Slide 17 text

defmodule Stacker.Supervisor do use Supervisor.Behaviour def start_link(stack) do :supervisor.start_link(__MODULE__, stack) end def init(stack) do children = [worker(Stacker.Server, [stack])] supervise children, strategy: :one_for_one end end SUPERVISOR.EX

Slide 18

Slide 18 text

Protocols Macros DocTest and lots more

Slide 19

Slide 19 text

elixir-lang.org #elixir-lang

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

ecto database query DSL

Slide 23

Slide 23 text

elixir-lang/ecto @ericmj

Slide 24

Slide 24 text

defmodule User do use Ecto.Model queryable "user" do field :name, :string end end MODEL.EX

Slide 25

Slide 25 text

defmodule FindUser do import Ecto.Query def find_by_name(name) do query = from u in User, where: u.name == ^name, limit: 1 Repo.all(query) end end QUERY.EX

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Repo

Slide 28

Slide 28 text

• wrapper • holds connections • executes queries • supervised worker

Slide 29

Slide 29 text

defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres def url do "ecto://user:pass@localhost/db" end end Repo.all(...) Repo.create(...) Repo.update(...) Repo.delete(...) REPO.EX

Slide 30

Slide 30 text

Entity

Slide 31

Slide 31 text

• fields • associations • elixir record

Slide 32

Slide 32 text

defmodule User do use Ecto.Model queryable "user" do field :name, :string field :password, :string, default: "secret" has_many :projects, Project end end MODEL.EX

Slide 33

Slide 33 text

Query

Slide 34

Slide 34 text

• relational algebra • extendable • macros • keyword lists

Slide 35

Slide 35 text

def paginate(query, page, size) do extend query, limit: size, offset: (page - 1) * size end query = FindUser.find_by_state("GA") query |> paginate(1, 50) |> Repo.all PAGINATE.EX

Slide 36

Slide 36 text

from u in User, where: u.name == ^name, limit: 1 QUERY.EX

Slide 37

Slide 37 text

from(u in User) |> where([u], u.name == ^name) |> limit(1) |> select([u], u) QUERY.EX

Slide 38

Slide 38 text

select( limit( where( from(u in User), [u], u.name == ^name ), 1 ), [u], u ) QUERY.EX

Slide 39

Slide 39 text

Gotchas

Slide 40

Slide 40 text

• error messages • validations • callbacks • type conversions • SQL migrations • missing mix tasks

Slide 41

Slide 41 text

elixir-lang/ecto examples/simple

Slide 42

Slide 42 text

Thanks! @josevalim @ericmj #elixir-lang

Slide 43

Slide 43 text

?