Как добавить несколько внешних ключей в одну строку во многих ко многим в экто

Можно ли вставить несколько много ко многим отношениям в одном? например, у меня есть таблица 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
Другие вопросы по тегам