Skip to content
This repository has been archived by the owner on Nov 18, 2020. It is now read-only.

almightycouch/rethinkdb_ecto

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RethinkDB.Ecto

Travis Hex.pm Documentation Status GitHub license Github Issues

RethinkDB adapter for Ecto 2.1.x (see issue #41 for Ecto 2.2.x support).

Installation

Add :rethinkdb_ecto to your list of dependencies in mix.exs:

def deps do
  [{:rethinkdb_ecto, "~> 0.7"}]
end

Finally, in the repository configuration, you will need to specify the :adapter:

config :my_app, MyApp.Repo,
  adapter: RethinkDB.Ecto,
  ...

Setup

First, create you repository with mix ecto.gen.repo and add the repository to you config:

config :my_app, ecto_repos: [MyApp.Repo]

Start the repository as a supervisor on your application’s supervisor:

def start(_type, _args) do
  import Supervisor.Spec

  children = [
    supervisor(MyApp.Repo, [])
  ]

  opts = [strategy: :one_for_one, name: MyApp.Supervisor]
  Supervisor.start_link(children, opts)
end

Define your schema:

defmodule User do
  use Ecto.Schema

  # You must define your primary-key and foreign-key types as :binary_id
  @primary_key {:id, :binary_id, autogenerate: false}
  @foreign_key_type :binary_id

  schema "users" do
    field :name, :string
    field :age, :integer
    has_many :posts, Post
    timestamps
  end
end

And the matching migration:

defmodule UserMigration do
  use Ecto.Migration

  def change do
    create table("users")
    create index("users", [:name])
  end
end

Create the database and apply migrations:

$ mix ecto.create
$ mix ecto.migrate

You are ready to go.

Usage

The adapter supports almost all of Ecto.Query functions. This includes group-by and order-by clauses, aggregators, ranges, complex filter and select queries, etc.

Start a IEx shell and run a few basic queries:

iex(2)> MyApp.Repo.insert %Post{title: "Ecto is great!"}
iex(3)> MyApp.Repo.one Post

You can build relationships using :belongs_to, has_one, has_many, etc. in your schema definitions and use them to load associations:

iex(4)> MyApp.Repo.all(Post) |> MyApp.Repo.preload(:comments)

RethinkDB.Ecto provides support for :inner_join (default), which means that you can preload relationships within a single query:

iex(5)> MyApp.Repo.all from p in Post,
...(5)>               join: u in assoc(p, :author),
...(5)>               join: c in assoc(p, :comments),
...(5)>              where: u.name == "Theresia",
...(5)>            preload: [author: u, comments: c]

Limitations

Check the known limitations section in the RethinkDB.Ecto documentation.