Hello,
I’m trying to make a many_to_many association.
Here is my code:
schema "organizations" do
field(:actable_id, :integer)
field(:actable_type, :string)
field(:name, :string)
has_many(:user_memberships, Dsrvex.Rshift.UserMembership)
many_to_many :users, Dsrvex.Rshift.User, join_through: "user_memberships"
end
schema "user_memberships" do
field :active, :boolean, default: false
field :email, :string
field :share_product_feedback, :boolean, default: false
field :share_product_usage, :boolean, default: false
field :user_type, :string
belongs_to(:organization, Dsrvex.Rshift.Organization)
belongs_to(:user, Dsrvex.Rshift.User)
end
schema "users" do
field :email, :string
field :user_type, :string
has_many(:user_memberships, Dsrvex.Rshift.UserMembership)
many_to_many :organizations, Dsrvex.Rshift.Organization, join_through: "user_memberships"
end
And this is how I’m using it:
iex(1)> Dsrvex.Rshift.User.get(1) |> Dsrvex.RshiftRepo.preload(:organizations)
** (UndefinedFunctionError) function Dsrvex.Rshift.User.get/1 is undefined or private
(dsrvex) Dsrvex.Rshift.User.get(1)
iex(1)> Dsrvex.RshiftRepo.get(Dsrvex.Rshift.User, 1) |> Dsrvex.RshiftRepo.preload(:organizations)
[debug] QUERY OK source="users" db=318.0ms
SELECT u0."id", u0."email", u0."user_type" FROM "users" AS u0 WHERE (u0."id" = $1) [1]
[debug] QUERY ERROR source="organizations" db=7972.7ms queue=0.8ms
SELECT o0."id", o0."actable_id", o0."actable_type", o0."name", u1."id" FROM "organizations" AS o0 INNER JOIN "users" AS u1 ON u1."id" = ANY($1) INNER JOIN "user_memberships" AS u2 ON u2."user_id" = u1."id" WHERE (u2."organization_id" = o0."id") ORDER BY u1."id" [[1]]
** (Postgrex.Error) ERROR XX000 (internal_error): Assert
-----------------------------------------------
error: Assert
code: 1000
context: IsA((Node*)arrayExpr->args->tail->data.ptr_value, Const) -
query: 14485
location: xen_execute.cpp:6423
process: padbmaster [pid=12327]
-----------------------------------------------
(ecto) lib/ecto/adapters/sql.ex:431: Ecto.Adapters.SQL.execute_and_cache/7
(ecto) lib/ecto/repo/queryable.ex:133: Ecto.Repo.Queryable.execute/5
(ecto) lib/ecto/repo/queryable.ex:37: Ecto.Repo.Queryable.all/4
(elixir) lib/enum.ex:1314: Enum."-map/2-lists^map/1-0-"/2
If I do the same SQL query via psql, it works fine:
# SELECT o0."id", o0."actable_id", o0."actable_type", o0."name", u1."id" FROM "organizations" AS o0 INNER JOIN "users" AS u1 ON u1."id" = ANY(array[1]) INNER JOIN "user_memberships" AS u2 ON u2."user_id" = u1."id" WHERE (u2."organization_id" = o0."id") ORDER BY u1."id";
id | actable_id | actable_type | name | id
--------+------------+----------------------+-------------------------------------------+----
140455 | 1875 | qweqwe | Starr Detroit Academy | 1
157863 | 23 | dsfsdfsdf | Michigan | 1