2017-11-23 14 views
0

複数の多対多を1つに挿入することは可能ですか?たとえば、company_id、user_id、role_id、asset_id、およびproject_idを持つAccessListテーブルがあります。Ectoの多対多の同じ行に複数の外部キーを追加する方法

これらはすべて数多くあります。 AccessListは参照テーブルです。要求は、私は、ユーザーを取得するに来れば

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のここ

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 

のスキーマです、ロール、会社を作成したら、資産を作成してIDを一度に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

?コードは機能しませんか?挿入は起こっていませんか? – mudasobwa

+0

私のコードは正常に動作します。私のRailsでは、ActiveRecordを使用していましたが、すべての参照を取得して参照テーブルに挿入する必要はありません。私はこれを行うより良い方法があると思ったので、私は尋ねました。 –

答えて

0

それが1で、多くの関係に多くの複数挿入することは可能ですか?

はい、あなたのコード例では、ドキュメントからjoin schema exampleに似ている:あなたの問題は何

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 
+0

これはまさに私がやっていることです。私は 'put_assoc'などを使うことができると思っていました。あなたが私のコードを見たら、私は 'Asset'を挿入し、' id'を返して参照テーブルにすべての参照を挿入します –

関連する問題