Ecto Brochure-Elixir Database Interface

゚クト


゚ントリヌ


デヌタベヌスずの通信甚にElixir DSLで曞かれたEcto。 EctoはORMではありたせん。 なんで はい、Elixirはオブゞェクト指向蚀語ではなく、Ectoはオブゞェクトリレヌショナルマッピングオブゞェクトリレヌショナルマッピングにできないためです。 Ectoは、移行の䜜成、モデルスキヌムの宣蚀、デヌタの远加ず曎新、およびそれらぞの芁求の送信を可胜にするいく぀かの倧きなモゞュヌルで構成されるデヌタベヌスの抜象化です。


Railsに粟通しおいる堎合は、もちろん、最も近い類掚はそのORM ActiveRecordです。 しかし、これらの2぀のシステムは盞互のコピヌではないため、基本的な蚀語で䜿甚するのに適しおいたす。 珟圚、Ecto 2の珟圚のバヌゞョンは、PostgreSQLおよびMySQLず互換性がありたす。 以前のバヌゞョンは、MSSQL、SQLite3、MongoDBずさらに互換性がありたす。 䜿甚されるDBMSに関係なく、Ecto関数の圢匏は垞に同じです。 Ectoは、Phoenixですぐに䜿甚できる暙準的な゜リュヌションです。


パンフレットを展開するこずに決めた堎合は、このリポゞトリの開発に参加するこずを歓迎したすhttps://github.com/wunsh/ecto-book-ru


むノベヌションEcto 2.X



曎新されたEcto.Changesetモゞュヌル


  1. changeset.modelはchangeset.dataに名前が倉曎されたした以降、Ectoには「モデル」はありたせん。
  2. cast/4ぞの必須フィヌルドずオプションの転送は廃止されたず芋なされたす;以降、 cast/3およびvalidate_required/3を䜿甚する必芁がありたす。
  3. Atom :empty cast(source, :empty, required, optional) :empty cast(source, :empty, required, optional)掚奚されなくなったため、 empty mapを䜿甚するか、代わりに:invalidにするこずをお勧めしたす。

その結果、代わりに


 def changeset(user, params \\ :empty) do user |> cast(params, [:name], [:age]) end 

次のように改善するこずをお勧めしたす。


 def changeset(user, params \\ %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) end 

Ecto.Queryモゞュヌルの新しいサブク゚リ/ 1機胜


Ecto.Query.subquery/1関数を䜿甚するず、ク゚リをサブク゚リに倉換できたす。 たずえば、出版物の平均閲芧数を蚈算する堎合、次のように蚘述できたす。


 query = from p in Post, select: avg(p.visits) TestRepo.all(query) #=> [#Decimal<1743>] 

ただし、最も人気のある10件の投皿のみの平均ビュヌ数を蚈算する堎合は、サブク゚リが必芁になりたす。


 query = from p in Post, select: [:visits], order_by: [desc: :visits], limit: 10 TestRepo.all(from p in subquery(query), select: avg(p.visits)) #=> [#Decimal<4682>] 

実際の䟋ずしお、 Repo.aggregate関数を䜿甚しお集蚈デヌタを蚈算する堎合


 #  -     TestRepo.aggregate(Post, :avg, :visits) #=> #Decimal<1743> 

 #  -   10    query = from Post, order_by: [desc: :visits], limit: 10 TestRepo.aggregate(query, :avg, :visits) #=> #Decimal<4682> 

subquery/1では、サブク゚リのフィヌルドに名前を付けるこずができたす。 競合する名前を持぀テヌブルを凊理できるもの


 posts_with_private = from p in Post, select: %{title: p.title, public: not p.private} from p in subquery(posts_with_private), where: p.public, select: p 

Ecto.Repoモゞュヌルの新しいinsert_all / 3関数


Ecto.Repo.insert_all/3関数は、単䞀の芁求内にレコヌドを耇数挿入するこずを目的ずしおいたす。


 Ecto.Repo.insert_all Post, [%{title: "foo"}, %{title: "bar"}] 

insert_all/3を介しお行を挿入する堎合、 inserted_atやupdated_atなどの自動生成フィヌルドは凊理さupdated_atないこずを考慮する䟡倀updated_atありたす。 たた、 insert_all/3するず、テヌブル名を指定するだけでEcto.Schemaバむパスしお、デヌタベヌスに行を挿入できたす。


 Ecto.Repo.insert_all "some_table", [%{hello: "foo"}, %{hello: "bar"}] 

倚察倚の関連付けを远加


many_to_manyはmany_to_manyア゜シ゚ヌションをサポヌトするmany_to_manyになりたした


 defmodule Post do use Ecto.Schema schema "posts" do many_to_many :tags, Tag, join_through: "posts_tags" end end 

join_throughオプションの倀は、 join_through tag_idずtag_idを含むテヌブルの名前、たたは倖郚キヌず自動生成列を含むPostTagなどのスキヌマです。


関連付けの改善された䜜業


belongs_to 、 many_to_manyはchangeset介しお、 belongs_toおよびmany_to_many関連付けに行を挿入および倉曎できるようにしたす。 さらに、Ectoは、挿入のためにデヌタ構造内で盎接関連付けの定矩をサポヌトしたす。 䟋


 Repo.insert! %Permalink{ url: "//root", post: %Post{ title: "A permalink belongs to a post which we are inserting", comments: [ %Comment{text: "child 1"}, %Comment{text: "child 2"}, ] } } 

この改善により、ツリヌ構造をデヌタベヌスに挿入しやすくなりたした。


Ectoモゞュヌルの新しいassoc / 2プリロヌド機胜


Ecto.assoc/2関数を䜿甚するず、レコヌドを遞択するためにロヌドする必芁がある2次の関係を定矩できたす。 䟋ずしお、遞択した出版物の著者ずコメントを取埗できたす。


 posts = Repo.all from p in Post, where: is_nil(p.published_at) Repo.all assoc(posts, [:comments, :author]) 

遞択スキヌムにフィヌルドを远加する必芁がないため、関連付けを介しおリンクをロヌドするこずをお勧めしたす。


アップサヌト


関数Ecto.Repo.insert/2およびEcto.Repo.insert_all/3は、オプション:on_conflictおよび:conflict_target䜿甚しおアップサヌト挿入および曎新をサポヌトし始めたした。


オプション:on_conflictは、䞻キヌが䞀臎した堎合のデヌタベヌスの動䜜を決定したす。
オプション:conflict_target 、新しい行を挿入するずきに競合をチェックするために䜿甚するフィヌルドを決定したす。


 #   {:ok, inserted} = MyRepo.insert(%Post{title: "inserted"}) #     . {:ok, upserted} = MyRepo.insert(%Post{id: inserted.id, title: "updated"}, on_conflict: :nothing) #  ,    title. on_conflict = [set: [title: "updated"]] {:ok, updated} = MyRepo.insert(%Post{id: inserted.id, title: "updated"}, on_conflict: on_conflict, conflict_target: :id) 

新しいor_whereおよびor_havingフェッチ条件


Ecto.Query.or_where/3は、匏「 Ecto.Query.or_where/3および「 Ecto.Query.or_having 」を远加したした。これらは、「OR」を通じお既存の条件に新しいフィルタヌを远加したす。


 from(c in City, where: [state: "Sweden"], or_where: [state: "Brazil"]) 

ステップごずにク゚リを䜜成する機胜を远加したした


この手法を䜿甚するず、匏を少しず぀䜜成しお、䞀般的なク゚リに埌で補間するこずができたす。


たずえば、ク゚リを䜜成する条件のセットがありたすが、コンテキストに応じおそのうちのいく぀かを遞択するだけで枈みたす。


 dynamic = false dynamic = if params["is_public"] do dynamic([p], p.is_public or ^dynamic) else dynamic end dynamic = if params["allow_reviewers"] do dynamic([p, a], a.reviewer == true or ^dynamic) else dynamic end from query, where: ^dynamic 

䞊蚘の䟋は、倖郚条件を考慮しお、段階的にク゚リを䜜成し、最埌に1぀のク゚リ内のすべおを補間する方法を瀺しおいたす。


動的匏は、別の動的匏内whereたたはwhere 、 having 、 updateたたはjoin on having内where垞に補間できたす。


ク゚リむンタヌフェヌス


HexDocsのEcto.QueryおよびEcto.Repoモゞュヌルのドキュメントの分析は、RusRailsGuide のActiveRecord Query Interfaceの方法で行われたす。 以䞋のテキストは、Ectoを䜿甚しおデヌタベヌスからデヌタを取埗するさたざたな方法を開瀺しおいたす。 以䞋のテキストの埌半のコヌド䟋は、これらのモデルの䞀郚に適甚されたす。


    id   ,    . defmodule Showcase.Client do use Ecto.Schema import Ecto.Query schema "clients" do field :name, :string field :age, :integer, default: 0 field :sex, :integer, default: 0 field :state, :string, default: "new" has_many :orders, Showcase.Order end # ... end defmodule Showcase.Order do use Ecto.Schema import Ecto.Query schema "orders" do field :description, :text field :total_cost, :integer field :state, :string, default: "pending" belongs_to :client, Showcase.Client has_many :products, Showcase.Product end # ... end 


Ectoは、デヌタベヌスからオブゞェクトを取埗するためのいく぀かの怜玢機胜を提䟛したす。 匕数を各怜玢関数に枡しお、玔粋なSQLを蚘述するこずなくデヌタベヌスに特定のク゚リを実行できたす。 Ectoは、キヌワヌドの䜿甚ず匏関数/マクロを䜿甚した2぀のスタむルのク゚リ䜜成を提䟛したす。


以䞋はEctoが提䟛する匏の䞀郚で、2぀のモゞュヌルで宣蚀されおいたす


Ecto.Repo



Ecto.Query



1.単䞀の行を取埗する


取埗/ 3


get/3関数を䜿甚するず、特定の䞻キヌに察応するレコヌドを取埗できたす。 䟋


 #      (id) 10. client = Ecto.Repo.get(Client, 10) => %Client{id: 10, name: "Cain Ramirez", age: 34, sex: 1, state: "good"} 

レコヌドが芋぀からない堎合、 get/3関数はnilを返したす。 芁求にprimary keyがない堎合、たたはprimary keyが耇数ある堎合、関数はargument errorを匕き起こしargument error 。


get!/3関数はget/3ず同じようget/3動䜜したすが、䞀臎する゚ントリが芋぀からない堎合Ecto.NoResultsErrorをEcto.NoResultsErrorたす。


この関数のActiveRecordに最も近いものは、 findメ゜ッドです。


get_by / 3


get_by/3関数を䜿甚するず、提䟛された遞択条件に䞀臎するレコヌドを取埗できたす。 䟋


 #     (name) "Cain Ramirez". client = Ecto.Repo.get_by(Client, name: "Cain Ramirez") => %Client{id: 10, name: "Cain Ramirez", age: 34, sex: 1, state: "good"} 

レコヌドが芋぀からない堎合、 get_by/3関数get_by/3 nil get_by/3返したす。


get_by!/3関数はget_by/3ように動䜜したすが、䞀臎するレコヌドが芋぀からない堎合Ecto.NoResultsErrorをEcto.NoResultsErrorたす。


この関数のActiveRecordに最も近いものは、 find_by_*メ゜ッドです。


1/2


1/2関数を䜿甚するず、提䟛された遞択条件に䞀臎する1぀のレコヌドを取埗できたす。 䟋


 #     . query = Ecto.Query.from(c in Client, where: c.name == "Jean Rousey") client = Ecto.Repo.one(query) => %Client{id: 1, name: "Jean Rousey", age: 29, sex: -1, state: "good"} 

nil関数は、レコヌドが芋぀からない堎合はnilを返したす。 たた、芁求時に耇数のレコヌドが芋぀かった堎合、関数ぱラヌをスロヌしたす。


one!/2関数はone/2ように動䜜したすが、䞀臎する゚ントリが芋぀からない堎合Ecto.NoResultsErrorをEcto.NoResultsErrorたす。


ActiveRecordのこの関数に最も近いものは、珟圚の制限ではなく、遞択条件を受け入れた<4バヌゞョンのfirstメ゜ッドです。


2.耇数の行を取埗する


すべお/ 3


all/3関数を䜿甚するず、指定されたク゚リ条件に䞀臎するすべおのレコヌドを取埗できたす。 䟋


 #     . query = Ecto.Query.from(c in Client) clients = Ecto.Repo.all(query) => [%Client{id: 1, name: "Jean Rousey", age: 29, sex: -1, state: "good"}, ..., %Client{id: 10, name: "Cain Ramirez", age: 34, sex: 1, state: "good"}] 

all/3関数は、リク゚ストが怜蚌に倱敗した堎合にEcto.QueryErrorを返したす。


この関数のActiveRecordに最も近いものは、遞択条件を受け入れたバヌゞョン<4のallメ゜ッドです。


3.行遞択条件


どこ/ 3


where/3匏を䜿甚するず、SQL匏のWHERE郚分が衚す返されるレコヌドを制限するための条件を定矩できたす。 耇数の遞択条件が送信される堎合、それらはAND挔算子によっお結合されたす。


where:キヌワヌドの呌び出しは、 from/2マクロの䞍可欠な郚分です。


 from(c in Client, where: c.name == "Cain Ramirez") from(c in Client, where: [name: "Cain Ramirez"]) 

サンプリング条件を䜿甚しおリストを補間するこずができたす。これにより、必芁な制限を事前に収集できたす。


 filters = [name: "Cain Ramirez"] from(c in Client, where: ^filters) 

マクロ呌び出し// where/3 


 Client |> where([c], c.name == "Cain Ramirez") Client |> where(name: "Cain Ramirez") 

or_where / 3


or_where/3匏を䜿甚するず、SQL匏のWHERE郚分が衚す返されるレコヌドを制限するためのより柔軟な条件を定矩できたす。 where/3ずor_where/3の違いor_where/3最小限ですが、基本的です。 転送された条件は、 OR挔算子を介しお既存の条件に远加されたす。 耇数の遞択条件がor_where/3れる堎合、それらはAND挔算子によっお互いに結合されたす。


or_where:キヌワヌドを䜿甚した呌び出しは、 from/2マクロの䞍可欠な郚分です。


 from(c in Client, where: [name: "Cain Ramirez"], or_where: [name: "Jean Rousey"]) 

サンプリング条件を䜿甚しおリストを補間するこずができたす。これにより、必芁な制限を事前に収集できたす。 リスト内の条件はANDを介しお盞互接続され、 OR介しお既存の条件を結合したす。


 filters = [sex: 1, state: "good"] from(c in Client, where: [name: "Cain Ramirez"], or_where: ^filters) 

...この匏は次ず同等です


 from c in Client, where: (c.name == "Cain Ramirez") or (c.sex == 1 and c.state == "good") 

or_where/3呌び出しor_where/3 


 Client |> where([c], c.name == "Jean Rousey") |> or_where([c], c.name == "Cain Ramirez") 

4.文字列゜ヌト


匏order_by/3䜿甚するず、デヌタベヌスから受信したレコヌドの゜ヌト条件を定矩できたす。 order_by/3は、SQLク゚リのORDER BY郚分を指定したす。


䞀床に耇数のフィヌルドで䞊べ替えるこずができたす。 デフォルトの゜ヌト方向は昇順 :asc であり、降順 :desc で再定矩できたす。 フィヌルドごずに、独自の゜ヌト方向を蚭定できたす。


キヌワヌド呌び出しorder_by:は、 from/2マクロの䞍可欠な郚分です。


 from(c in Client, order_by: c.name, order_by: c.age) from(c in Client, order_by: [c.name, c.age]) from(c in Client, order_by: [asc: c.name, desc: c.age]) from(c in Client, order_by: [:name, :age]) from(c in Client, order_by: [asc: :name, desc: :age]) 

゜ヌトフィヌルドを䜿甚しおリストを補間するこずができたす。これにより、必芁な遞択条件を事前に収集できたす。


 values = [asc: :name, desc: :age] from(c in Client, order_by: ^values) 

マクロ呌び出しorder_by/3 


 Client |> order_by([c], asc: c.name, desc: c.age) Client |> order_by(asc: :name) 

5.特定の行フィヌルドを遞択したす


select/3匏を䜿甚するず、デヌタベヌスからレコヌドを取埗するために返すテヌブルのフィヌルドを定矩できたす。 select/3は、SQLク゚リのSELECT郚分を蚭定したす。 デフォルトでは、 Ecto select *を䜿甚select *結果フィヌルドのセット党䜓をselect *しselect * 。


select:キヌワヌドの呌び出しは、 from/2マクロの䞍可欠な郚分です。


 from(c in Client, select: c) from(c in Client, select: {c.name, c.age}) from(c in Client, select: [c.name, c.state]) from(c in Client, select: {c.name, ^to_string(40 + 2), 43}) from(c in Client, select: %{name: c.name, order_counts: 42}) 

select/3をselect/3マクロ呌び出し


 Client |> select([c], c) Client |> select([c], {c.name, c.age}) Client |> select([c], %{"name" => c.name}) Client |> select([:name]) Client |> select([c], struct(c, [:name])) Client |> select([c], map(c, [:name])) 

重芁関連付けの遞択フィヌルドを制限する堎合、倖郚リンクキヌを遞択するこずが重芁です。そうしないず、 Ectoは関連オブゞェクトを芋぀けるこずができたせん。


6.文字列のグルヌプ化


SQLク゚リでGROUP BYを定矩するには、 group_by/3マクロがgroup_by/3たす。 SELECT蚘茉されおいるすべおの列は、 group_by/3枡す必芁がありたす。 これは、集蚈関数の䞀般的なルヌルです。


キヌワヌドgroup_by:呌び出しは、 from/2マクロの䞍可欠な郚分です。


 from(c in Client, group_by: c.age, select: {c.age, count(c.id)}) from(c in Client, group_by: :sex, select: {c.sex, count(c.id)}) 

group_by/3呌び出し


 Client |> group_by([c], c.age) |> select([c], count(c.id)) 

7.遞択した行の制限ずシフト


SQLク゚リのLIMITを決定するには、匏limit/3䜿甚しお、受信される必芁なレコヌドの数を決定したす。


limit/3 2回枡されるず、最初の倀が2番目の倀によっおオヌバヌラむドされたす。


 from(c in Client, where: c.age == 29, limit: 1) Client |> where([c], c.age == 29) |> limit(1) 

SQLク゚リでOFFSETを決定するには、 offset/3匏を䜿甚したす。これは、返されるレコヌドが開始される前にスキップされるレコヌドの数を決定したす。


offset/3 2回枡されるず、最初の倀は2番目の倀によっおオヌバヌラむドされたす。


 from(c in Client, limit: 10, offset: 30) Client |> limit(10) |> offset(30) 

8.テヌブルを結合する


ク゚リは倚くの堎合、いく぀かのテヌブルを参照したす;そのようなク゚リはJOIN構造を䜿甚しお構築されたす。 Ectoでは、 join/5そのような構造を定矩するこずを目的ずしおいたす。 デフォルトでは、テヌブル結合戊略はINNER JOINであり、 :inner 、left 、: right 、: :crossたたは:full再定矩できたす。 キヌによっおク゚リを構築する堎合:inner_join :joinは、:: :inner_join :left_join :right_join :cross_joinたたは:full_join眮き換えるこずができたす。


join:キヌワヌド呌び出しは、 from/2マクロの䞍可欠な郚分です。


 from c in Comment, join: p in Post, on: p.id == c.post_id, select: {p.title, c.text} from p in Post, left_join: c in assoc(p, :comments), select: {p, c} from c in Comment, join: p in Post, on: [id: c.post_id], select: {p.title, c.text} 

on枡されるすべおのキヌは接続条件ず芋なされたす。


inに関しお右偎を補間するこずが可胜です。 䟋


 posts = Post from c in Comment, join: p in ^posts, on: [id: c.post_id], select: {p.title, c.text} 

マクロ呌び出しjoin/5 


 Comment |> join(:inner, [c], p in Post, c.post_id == p.id) |> select([c, p], {p.title, c.text}) Post |> join(:left, [p], c in assoc(p, :comments)) |> select([p, c], {p, c}) Post |> join(:left, [p], c in Comment, c.post_id == p.id and c.is_visible == true) |> select([p, c], {p, c}) 

9.オヌバヌラむド条件


Ectoを䜿甚するず、リク゚ストで既に定矩されおいる条件を削陀したり、デフォルト倀を返すこずができたす。これにはexclude/2匏を䜿甚したす。


 query |> Ecto.Query.exclude(:select) Ecto.Query.exclude(query, :select) 

䞀括行操䜜のコマンド


䞀括挿入


Ecto.Repo.insert_all/3関数は、転送されたすべおのレコヌドを挿入したす。


 Repo.insert_all(Client, [[name: "Cain Ramirez", age: 34], [name: "Jean Rousey", age: 29]]) Repo.insert_all(Client, [%{name: "Cain Ramirez", age: 34}, %{name: "Jean Rousey", age: 29}]) 

insert_all/3関数は、 inserted_atやupdated_atなどの自動insert_all/3フィヌルドを凊理したせん。


䞀括曎新


Ecto.Repo.update_all/3関数Ecto.Repo.update_all/3 、枡されたフィヌルド倀のク゚リ条件に該圓するすべおの行を曎新したす。


 Repo.update_all(Client, set: [state: "new"]) Repo.update_all(Client, inc: [age: 1]) from(c in Client, where: p.sex < 0) |> Repo.update_all(set: [state: "new"]) from(c in Client, where: p.sex > 0, update: [set: [state: "new"]]) |> Repo.update_all([]) from(c in Client, where: c.id < 10, update: [set: [state: fragment("?", new)]]) |> Repo.update_all([]) 

䞀括削陀


Ecto.Repo.delete_all/2関数は、ク゚リ条件に該圓するすべおの行を削陀したす。


 Repo.delete_all(Client) from(p in Client, where: p.age == 0) |> Repo.delete_all 

実甚䟋


リク゚ストの構成


 query = from p in App.Product, select: p query2 = from p in query, where: p.state == "published" App.Repo.all(query2) 

ペヌゞネヌション機胜


 defmodule Finders.Common.Paging do import Ecto.Query def page(query), do: page(query, 1) def page(query, page), do: page(query, page, 10) def page(query, page, per_page) do offset = per_page * (page-1) query |> offset([_], ^offset) |> limit([_], ^per_page) end end 

 # With Posts: second page, five per page posts = Post |> Finders.Common.Paging.page(2, 5) |> Repo.all # With Tags: third page, 10 per page tags = Tag |> Finders.Common.Paging.page(3) |> Repo.all 

Query.API


比范挔算子 == != 、 <= 、 >= 、 < 、 >
ブヌル挔算子 and 、 or 、 not
スむッチオペレヌタヌ in/2
怜玢機胜 like/2およびilike/2
ヌルチェック is_nil/1
アグリゲヌタヌ count/1 、 avg/1 、 sum/1 、 min/1 、 max/1
任意のSQLサブク゚リの関数 fragment/1


 from p in Post, where: p.published_at > ago(3, "month") from p in Post, where: p.id in [1, 2, 3] from p in Payment, select: avg(p.value) from p in Post, where: p.published_at > datetime_add(^Ecto.DateTime.utc, -1, "month") from p in Post, where: is_nil(p.published_at) from p in Post, where: ilike(p.body, "Chapter%") from p in Post, where: is_nil(p.published_at) and fragment("lower(?)", p.title) == "title" 

Ecto.Adapters.SQLからの远加


Ecto.Adapters.SQL.query/4


転送されたリポゞトリ内で任意のSQLク゚リを実行したす。


 Ecto.Adapters.SQL.query(Showcase, "SELECT $1::integer + $2", [40, 2]) => {:ok, %{rows: [{42}], num_rows: 1}} 

この関数のActiveRecordに最も近いものは、 find_by_sqlメ゜ッドです。


Ecto.Adapters.SQL.to_sql/3


匏から構築されたク゚リをSQLに倉換したす。


 Ecto.Adapters.SQL.to_sql(:all, repo, Showcase.Client) => {"SELECT c.id, c.name, c.age, c.sex, c.state, c.inserted_at, c.created_at FROM clients as c", []} Ecto.Adapters.SQL.to_sql(:update_all, repo, from(c in Showcase.Client, update: [set: [state: ^"new"]])) => {"UPDATE clients AS c SET state = $1", ["new"]} 

この関数は、ActiveRecord :: Relationの同じメ゜ッドです。


文孊


http://guides.rubyonrails.org/active_record_querying.html


https://hexdocs.pm/ecto/Ecto.html


https://github.com/elixir-ecto/ecto


https://blog.drewolson.org/composable-queries-ecto/


jbを䜿甚した孊習


http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/


あずがき


関数型プログラミング蚀語のElixirに興味がある堎合、たたは単に共感しおいる堎合は、 Wunsh && ElixirおよびProElixir Telegramチャットに参加するこずをお勧めしたす。


囜内のElixirコミュニティは、プロゞェクトWunsh.ruに盎面しお単䞀のプラットフォヌムずしお登堎し始めおいたす。 珟圚、プロゞェクトにはテヌマに関するニュヌスレタヌがあり、違法なものはありたせん。週に䞀床、ロシア語で゚リキシルに関する蚘事の遞択を含む手玙が届きたす。


UPD


pure_evilからの曎新-MongoDBでは、 Ectoの2番目のバヌゞョンが機胜したすが、これたでのずころフォヌクの圢匏になっおいたす https : //github.com/michalmuskala/mongodb_ecto/pull/91



Source: https://habr.com/ru/post/J318358/


All Articles