View Source EctoForge.CreateExtension.Get behaviour (ecto_forge v0.1.20)
You can use callback functions for processing. After the query and before the query to filter the data.
You can use callback functions for processing. After the query and before the query to filter the data. module MyApp.UserModel -> your own module mode -> :all or :one query -> handled query repo -> MyApp.Repo list_exetensions_executed -> Executed list of extensions attrs -> attributes that fall
def before_query_add_extension_to_get(_module, _mode, _repo, _list_exetensions_executed, query, attrs) do
# module MyApp.UserModel
{query, attrs} # must return query and modified attributes
end
def after_query_add_extension_to_get(module, mode, repo, _list_exetensions_executed, prev_query, result, attrs) do
# module MyApp.UserModel
{prev_query,result, attrs} # must return result and modified attributes
end
options :stop, :result
when you use before_query_add_extension_to_get() you can return tuple with {:result, Repo.all(query), attrs} This means that your before_query_add_extension_to_get will not go any further I will return a result. This is to bypass the default repo.all function for management
def before_query_add_extension_to_get(_module, _mode, repo, _list_exetensions_executed, query, attrs) do
{:result, repo.all(query), query, attrs} # stoped and don't to execute repo.all or one
end
def before_query_add_extension_to_get(_module, _mode, _repo,_list_exetensions_executed, query, attrs) do
{:stop,query, attrs} # stoped and don't to execute another exensions
end
def after_query_add_extension_to_get(module, mode, repo, prev_query,_list_exetensions_executed, result, attrs) do
{:stop,query, attrs} # stoped and don't to execute another exensions
end
How to create your extension
Create extenstion is using callbacks before_query_add_extension_to_get(_module, _mode, _repo, query, attrs), after_query_add_extension_to_get(module, mode, repo, prev_query, result, attrs)
Connect EctoForge.CreateExtension.Get
defmodule MyApp.Extension.Get.WhereIsMyUserIdOne do
use EctoForge.CreateExtension.Get
end
and After that use your callbacks
defmodule MyApp.Extension.Get.WhereIsMyUserIdOne do
use EctoForge.CreateExtension.Get
def before_query_add_extension_to_get(_module, _mode, _repo, _list_exetensions_executed, query, attrs) do
new_query = where([u], u.id == 1)
{query, attrs}
end
end
Example
defmodule EctoForge.Extension.Get.Preload do
@moduledoc """
## Use preload with your model
### Example
MyApp.UserModel.find(preload: [:posts])
"""
alias EctoForge.Helpers.RepoBase.Utls
import Ecto.Query
use EctoForge.CreateExtension.Get
def before_query_add_extension_to_get(_module, _mode, _repo, _list_exetensions_executed, query, attrs) do
attrs = Keyword.delete(attrs, :preload)
if is_list(preload_attrs) do
{preload(query, ^preload_attrs), attrs}
else
{query, attrs}
end
end
end
Summary
Callbacks
Link to this callback
after_query_add_extension_to_get( module, mode, repo, list_exetensions_executed, prev_query, result, attrs )
View Source@callback after_query_add_extension_to_get( module :: module(), mode :: atom() | :all | :one, repo :: Ecto.Repo.t(), list_exetensions_executed :: list(), prev_query :: Ecto.Query.t(), result :: any(), attrs :: map() | keyword() ) :: tuple() | {Ecto.Query.t(), any(), map() | keyword()} | {:stop, Ecto.Query.t(), any(), map() | keyword()}
Link to this callback
before_query_add_extension_to_get(module, mode, repo, list_exetensions_executed, query, attrs)
View Source@callback before_query_add_extension_to_get( module :: module(), mode :: atom() | :all | :one, repo :: Ecto.Repo.t(), list_exetensions_executed :: list(), query :: Ecto.Query.t(), attrs :: map() | keyword() ) :: tuple() | {Ecto.Query.t(), map() | keyword()} | {:stop, Ecto.Query.t(), map() | keyword()} | {:result, any(), Ecto.Query.t(), map() | keyword()}