Elixir Ecto:다 중 관계
코드 라 이브 러 리
https://github.com/developerworks/ecto_test
다 중 관계 정의
이식 스 크 립 트 만 들 기
mix ecto.gen.migration create_table_users -r EctoTest.Repo
mix ecto.gen.migration create_table_chat_groups -r EctoTest.Repo
mix ecto.gen.migration create_table_chat_group_users -r EctoTest.Repo
이식 스 크 립 트 의 내용 은 다음 과 같 습 니 다.
20160429075137_create_table_users.exs
defmodule EctoTest.Repo.Migrations.CreateTableUsers do
use Ecto.Migration
def up do
create table(:users) do
add :name, :string, default: ""
timestamps
end
@doc """
Create an partial index(name != '') on `:name` column of table `users`
"""
create index(:users, [:name], [unique: true, where: "name != ''"])
end
def down do
drop table(:users)
drop index(:users, [:name])
end
end
20160429075138_create_table_chat_groups.exs
defmodule EctoTest.Repo.Migrations.CreateTableChatGroups do
use Ecto.Migration
def up do
create table(:chat_groups) do
add :name, :string, null: false
end
end
def down do
drop table(:chat_groups)
end
end
20160429075146_create_table_chat_group_users.exs
defmodule EctoTest.Repo.Migrations.CreateTableChatGroupUsers do
use Ecto.Migration
def up do
create table(:chat_group_users) do
add :user_id, references(:users)
add :chat_group_id, references(:chat_groups)
timestamps
end
end
def down do
drop table(:chat_group_users)
end
end
이식 을 집행 하 다
➜ ecto_test git:(master) ✗ mix ecto.migrate -r EctoTest.Repo
16:14:05.200 [info] == Running EctoTest.Repo.Migrations.CreateTableChatGroupUsers.up/0 forward
16:14:05.200 [info] create table chat_group_users
16:14:05.211 [info] == Migrated in 0.0s
모델 코드
lib/ecto_test/model/user.ex
defmodule EctoTest.Model.User do
@moduledoc """
"""
use EctoTest.Model
alias EctoTest.Model.ChatGroupUser
schema "users" do
field :name, :string, null: false
has_many :chat_group_users, ChatGroupUser
has_many :chats, through: [:chat_group_users, :chat]
timestamps
end
@spec insert(map) :: {:ok, Schema.t} | {:error, Changeset.t}
def insert(map) do
Map.merge(%__MODULE__{}, map) |> Repo.insert
end
end
lib/ecto_test/model/chat_group.ex
defmodule EctoTest.Model.ChatGroup do
@moduledoc """
"""
use EctoTest.Model
alias EctoTest.Model.ChatGroupUser
schema "chat_groups" do
field :name, :string, null: false
has_many :chat_group_users, ChatGroupUser
has_many :users, through: [:chat_group_users, :user]
end
@spec insert(map) :: {:ok, Schema.t} | {:error, Changeset.t}
def insert(map) do
Map.merge(%__MODULE__{}, map) |> Repo.insert
end
end
lib/ecto_test/model/chat_group_user.ex
defmodule ChatGroupUser do
@moduledoc """
"""
use EctoTest.Model
alias EctoTest.Model.ChatGroup
schema "chat_group_users" do
belongs_to :chat_group, ChatGroup
belongs_to :user, User
timestamps
end
@spec insert(map) :: {:ok, Schema.t} | {:error, Changeset.t}
def insert(map) do
Map.merge(%__MODULE__{}, map) |> Repo.insert
end
end
다 중 관계 읽 기
데이터 삽입
iex(1)> user = %EctoTest.Model.User{name: "user1"} |> EctoTest.Repo.insert!
16:48:47.128 [debug] QUERY OK db=0.2ms
begin []
16:48:47.149 [debug] QUERY OK db=1.3ms
INSERT INTO "users" ("inserted_at","updated_at","name") VALUES ($1,$2,$3) RETURNING "id" [{{2016, 4, 29}, {8, 48, 47, 0}}, {{2016, 4, 29}, {8, 48, 47, 0}}, "user1"]
16:48:47.149 [debug] QUERY OK db=0.5ms
commit []
%EctoTest.Model.User{__meta__: #Ecto.Schema.Metadata<:loaded>,
chat_group_users: #Ecto.Association.NotLoaded,
chats: #Ecto.Association.NotLoaded, id: 1,
inserted_at: #Ecto.DateTime<2016-04-29 08:48:47>, name: "user1",
updated_at: #Ecto.DateTime<2016-04-29 08:48:47>}
데이터 삽입
chat_group = %EctoTest.Model.ChatGroup{name: "chat_group2"} |> EctoTest.Repo.insert!
user = %EctoTest.Model.User{name: "user2"} |> EctoTest.Repo.insert!
%EctoTest.Model.ChatGroupUser{user_id: user.id, chat_group_id: chat_group.id} |> EctoTest.Repo.insert!
사용자 및 사용자 채 팅 그룹 읽 기
EctoTest.Model.User |> EctoTest.Repo.get(1) |> EctoTest.Repo.preload(:chat_groups)
호출
명령
mix ecto.create # Creates the repository storage
mix ecto.drop # Drops the repository storage
mix ecto.dump # Dumps database structure
mix ecto.gen.migration # Generate a new migration for the repo
mix ecto.gen.repo # Generate a new repository
mix ecto.load # Loads previously dumped database structure
mix ecto.migrate # Runs the repository migrations
mix ecto.rollback # Rolls back migrations
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
비약: Trabalhando com Associações no EctoResolvi fazer esse post, para traduzir o post citado acima para o português e adicionar mais detalhes, fazendo um projet...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.