Votex

Implements vote / like / follow functionality for Ecto models in Elixir

Inspired from Acts as Votable in ROR

Features

  • Any model can be voted
  • Any model can vote
  • Supports self referential voting
  • Easy to understand syntax

Installation

Add Votex to your project dependencies mix.exs

defp deps do
  [{:votex, "~> 0.2.0"}]
end

Specify your root project’s repo in config

config :votex, Votex.DB,
  repo: MyApp.Repo

Votex needs a table in DB to store votes information Install votex and generate votex schema migration

mix deps.get
mix votex.gen.migration
mix ecto.migrate

Usage

Configure Models
defmodule User do
  use Ecto.Schema
  use Votex.Voter
end

defmodule Post do
  use Ecto.Schema
  use Votex.Votable
end

Vote / Unvote

post |> Post.vote_by user
user |> User.voted_for? post
# true
post |> Post.votes_for |> length
# 1

post |> Post.votes_for
[
  %{
    id: 1,
    votable_id: 3,
    votable_type: "posts",
    voter: %Sample.User{
      id: 5,
      name: "John"
    },
    voter_id: 5,
    voter_type: "users"
  }
]

post |> Post.unvote_by user

Self Referential Vote

defmodule User do
  use Ecto.Schema 
  use Votex.Voter
  user Votex.Votable
end

user2 |> User.vote_by user1
# {:ok, _}