Description
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
- Easy to understand syntax
Votex alternatives and similar packages
Based on the "Framework Components" category.
Alternatively, view Votex alternatives based on common mentions on social networks and blogs.
-
ex_admin
ExAdmin is an auto administration package for Elixir and the Phoenix Framework -
phoenix_html
Phoenix.HTML functions for working with HTML strings and templates -
phoenix_ecto
Phoenix and Ecto integration with support for concurrent acceptance testing -
absinthe_plug
Plug support for Absinthe, the GraphQL toolkit for Elixir -
phoenix_live_reload
Provides live-reload functionality for Phoenix -
params
Easy parameters validation/casting with Ecto.Schema, akin to Rails' strong parameters. -
phoenix_pubsub_redis
The Redis PubSub adapter for the Phoenix framework -
dayron
A repository `similar` to Ecto.Repo that maps to an underlying http client, sending requests to an external rest api instead of a database -
phoenix_token_auth
Token authentication solution for Phoenix. Useful for APIs for e.g. single page apps. -
rummage_phoenix
Full Phoenix Support for Rummage. It can be used for searching, sorting and paginating collections in phoenix. -
sentinel
DEPRECATED - Phoenix Authentication library that wraps Guardian for extra functionality -
phx_component_helpers
Extensible Phoenix liveview components, without boilerplate -
plug_rails_cookie_session_store
Rails compatible Plug session store -
filterable
Filtering from incoming params in Elixir/Ecto/Phoenix with easy to use DSL. -
multiverse
Elixir package that allows to add compatibility layers via API gateways. -
access pass
provides a full user authentication experience for an API. Includes login,logout,register,forgot password, forgot username, confirmation email and all that other good stuff. Includes plug for checking for authenticated users and macro for generating the required routes. -
scrivener_headers
Scrivener pagination with headers and web linking -
better_params
Cleaner request parameters in Elixir web applications ๐ -
phoenix_pubsub_rabbitmq
RabbitMQ adapter for Phoenix's PubSub layer -
plug_checkup
PlugCheckup provides a Plug for adding simple health checks to your app -
plug_rest
REST behaviour and Plug router for hypermedia web applications in Elixir -
trailing_format_plug
An elixir plug to support legacy APIs that use a rails-like trailing format: http://api.dev/resources.json -
plug_canonical_host
PlugCanonicalHost ensures that all requests are served by a single canonical host. -
phoenix_html_simplified_helpers
Some helpers for phoenix html( truncate, time_ago_in_words, number_with_delimiter, url_for, current_page? )
Access the most powerful time series database as a service
Do you think we are missing an alternative of Votex or a related project?
Popular Comparisons
README
Votex
Implements :thumbsup: vote / :heart: like / follow functionality for Ecto models in Elixir
Inspired from Acts as Votable :star: in Ruby on Rails
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.3.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
use Votex.Votable
end
user2 |> User.vote_by user1
# {:ok, _}
Cleanup
Since polymorphic associations are not supported in Ecto and callbacks are deprecated, orphan votes need to be cleared when a parent entity is destroyed. Therefore, you need to call cleanup_votes when you delete a Voter or a Votable record.
# Delete user
Repo.delete(user) |> User.cleanup_votes
# Delete post
Repo.delete(post) |> Post.cleanup_votes
Cache Support
Some fields like total number of votes on a post can be cached in posts table to avoid extra calls to DB. Votex will update the field if present in schema.
defmodule Post do
use Ecto.Schema
use Votex.Votable
schema "posts" do
field(:cached_votes_for_total, :integer)
end
@fields ~w(cached_votes_for_total)a
# Publicly accessible changeset for Votex to update field
def changeset(post, attrs) do
post
|> cast(attrs, @fields)
|> validate_required(@fields)
end
end
The posts table will track total votes from now on
post |> Post.vote_by user
post = Repo.get(Post, 1)
post.cached_votes_for_total
# 5