Как добавить несколько внешних ключей в одну строку во многих ко многим в экто
Можно ли вставить несколько много ко многим отношениям в одном? например, у меня есть таблица AccessList, в которой есть company_id, user_id, role_id, asset_id и project_id
Они все много ко многим. AccessList является справочной таблицей.
Вот схема для AccessList
schema "access_lists" do
belongs_to :user, Db.User
belongs_to :role, Db.Role
belongs_to :asset, Db.Asset
belongs_to :project, Db.Project
belongs_to :company, Db.Company
timestamps()
end
Вот схема компании в качестве примера:
many_to_many :users, Db.User, join_through: Db.AccessList
many_to_many :assets, Db.Asset, join_through: Db.AccessList
many_to_many :roles, Db.Role, join_through: Db.AccessList
many_to_many :projects, Db.Project, join_through: Db.AccessList
Например, в данный момент, если поступит запрос, я получу пользователя, роль и компанию, затем создаю ресурс и сразу вставляю их идентификаторы в AccessList.
Образец:
def create_asset_relation(role, asset, user, company) do
changeset = create_asset_changeset( %{user_id: user.id, role_id: role.id, company_id: company.id, asset_id: asset.id})
with {:ok, _ } <- Repo.insert(changeset) do
{:ok, asset}
else
_ ->
"something gone wrong"
end
end
defp create_asset_changeset(params) do
AccessList.changeset(%AccessList{}, params)
end
1 ответ
Можно ли вставить несколько много ко многим отношениям в одном?
Да, ваш пример кода напоминает пример схемы соединения из документации:
defmodule UserOrganization do
use Ecto.Schema
@primary_key false
schema "users_organizations" do
belongs_to :user, User
belongs_to :organization, Organization
timestamps # Added bonus, a join schema will also allow you to set timestamps
end
def changeset(struct, params \\ %{}) do
struct
|> Ecto.Changeset.cast(params, [:user_id, :organization_id])
|> Ecto.Changeset.validate_required([:user_id, :organization_id])
# Maybe do some counter caching here!
end
end
defmodule User do
use Ecto.Schema
schema "users" do
many_to_many :organizations, Organization, join_through: UserOrganization
end
end
defmodule Organization do
use Ecto.Schema
schema "organizations" do
many_to_many :users, User, join_through: UserOrganization
end
end
# Then to create the association, pass in the ID's of an existing
# User and Organization to UserOrganization.changeset
changeset = UserOrganization.changeset(%UserOrganization{}, %{user_id: id, organization_id: id})
case Repo.insert(changeset) do
{:ok, assoc} -> # Assoc was created!
{:error, changeset} -> # Handle the error
end