即插即用库使功能变得简单。


“喜欢照片”,“上投票”或“关注用户”属于每个其他Web项目中需要进行的一组基本操作。 管理一个单独的实体或处理特定模型中的执行可能是一场永无休止的辩论。 让外部库负责这些基本任务是很明智的,而您的重点应该放在核心活动上。
让我们演示一个简单的博客应用程序。 从创建一个空的Phoenix项目开始
混合phx.new博客--no-brunch
cd博客
它将创建一个样板代码库以开始开发。 输入“ Y”继续安装依赖项。
在创建数据库之前,您需要更改配置文件,以便它可以访问数据库。
nano config / dev.exsconfig:blogger,Blogger.Repo,
适配器:Ecto.Adapters.Postgres,
用户名:“您的数据库用户名”,
密码:“您的数据库密码”,
现在,是时候创建数据库并运行开发服务器了。
混合ecto.create
混合phx.server
在浏览http:// localhost:4000时,将看到以下屏幕。


让我们在生成器的帮助下快速生成一些模型并进行迁移。
混合phx.gen.schema博客博客title:string views:integer
混合phx.gen.schema团队团队名称:字符串类别:字符串
混合phx.gen.schema用户用户用户名:字符串年龄:整数混合ecto.migrate
我们拥有三种型号,可以玩一会儿
iex -S mix#启动Interactive Elixir Shell%Blogger.User {用户名:“ alex01”,年龄:25} |> Blogger.Repo.insert%Blogger.Blog {标题:“ Elixir on Phoenix”,查看次数:0} |> Blogger.Repo.insert%Blogger.Team {名称:“ FYYT”,类别:“足球运动员”} |> Blogger.Repo.insert
在根项目中添加Votex作为依赖项并对其进行配置
defp deps do [
{:votex,“〜> 0.3.0”}
]
结束
config / config.exs
配置:votex,Votex.DB,
回购:Blogger.Repo
安装新包含的依赖项并运行迁移
混合deps.get
混合votex.gen.migration
混合ecto.migrate
修改Ecto的架构文件,这将公开votable函数。 目标是使Blog可以被用户或团队所喜爱。
简而言之,
用户是选民
团队是选民
博客是可移植的
lib / blogger / user.ex
defmodule Blogger.User做
使用Votex.Voter#添加此行
结束
lib / blogger / team.ex
defmodule Blogger.Team做
使用Votex.Voter
结束
lib / blogger / blog.ex
defmodule Blogger.Blog做
使用Votex.Votable
结束
最终魔术方法现在可以执行了
iex -S mix#Shellalias Blogger。{User,Blog,Team,Repo} user = Repo.all(User)|> Enum.at(0)
博客= Repo.all(博客)|>枚举(0)
team = Repo.all(Team)|> Enum.at(0)blog |> Blog.vote_by用户
#{:ok,%Votex.Vote {}}用户|> User.voted_for? 博客
#trueblog |> Blog.votes_for |>长度
#1blog |> Blog.unvote_by用户
#{:ok,%Votex.Vote {}}用户|> User.voted_for? 博客
#错误
投票者详细信息可以从博客中获取
博客|> Blog.votes_for |>枚举地图(fn投票->投票。投票人结束)[
%Blogger.Team {
__meta__:#Ecto.Schema.Metadata ,
类别:“足球运动员”,
编号:1
insert_at:〜N [2018-09-01 20:06:46.827705],
名称:“ FYYT”,
Updated_at:〜N [2018-09-01 20:06:46.827720]
},
%Blogger.User {
__meta__:#Ecto.Schema.Metadata <:已加载,“用户”,
年龄:25岁
编号:1
insert_at:〜N [2018-09-01 19:49:40.815278],
Updated_at:〜N [2018-09-01 19:49:40.818200],
用户名:“ alex01”
}
]
Votex还可以用于自我推荐投票,例如,一个用户可以关注另一个用户。 只需要将User声明为votable即可。
lib / blogger / user.ex
defmodule Blogger.User做
使用Votex.Voter
使用Votex.Votable
结束
现在,一个用户也可以关注另一个用户
user1 =用户{_,user2} =%User {用户名:“ brian17”,年龄:20} |> Repo.insertuser2 |> User.vote_by user1
# {:好, _}
user1 |> User.votes_for [
%{
__meta__:#Ecto.Schema.Metadata ,
__struct__:Votex.Vote,
编号:4
insert_at:〜N [2018-09-01 20:24:59.768915],
Updated_at:〜N [2018-09-01 20:24:59.768942],
votable_id:3,
votable_type:“用户”,
投票者:%Blogger.User {
__meta__:#Ecto.Schema.Metadata <:已加载,“用户”,
年龄:25岁
编号:1
insert_at:〜N [2018-09-01 19:49:40.815278],
Updated_at:〜N [2018-09-01 19:49:40.818200],
用户名:“ alex01”
},
选民编号:1
表决者类型:“用户”
}
]
目前为止就这样了。 我希望本文涵盖了应用可能需要的大多数用例。 我也恰好是Votex的创建者,因此希望能收到反馈。 您可以在Github上查看Votex。 它直接受到Ruby中的Acts as Votable的启发。 如果您觉得有用,请拍手。
航空业:开源电子商务
Aviacommerce是一个开放源代码的电子商务框架,旨在通过创建和统一智能服务并为卖家提供一致的,具有成本效益的解决方案来帮助他们销售更多商品,从而简化电子商务生态系统。 访问aviacommerce.org了解更多信息。

