Ectoが間違った結果を返す理由がわかりません。Ecto.Query結合が非常に多くのINNER JOINを生成します
SELECT u0."email", u0."id", r2."name", c1."name"
FROM "users" AS u0
INNER JOIN "access_lists" AS a4 ON a4."user_id" = u0."id"
INNER JOIN "companies" AS c1 ON a4."company_id" = c1."id"
INNER JOIN "access_lists" AS a5 ON a5."company_id" = c1."id"
INNER JOIN "roles" AS r2 ON a5."role_id" = r2."id"
INNER JOIN "access_lists" AS a6 ON a6."role_id" = r2."id"
INNER JOIN "assets" AS a3 ON a6."asset_id" = a3."id"
WHERE ((u0."id" = $1) AND (a3."id" = $2))
GROUP BY c1."id", u0."id", r2."id" [2, 1]
このクエリの結果は、これがある
間違っています: 私は物事をめちゃくちゃにされるかもしれないと、これは、それが生成する私のEcto.Query
from u in User,
join: c in assoc(u, :companies),
join: r in assoc(c, :roles),
join: a in assoc(r, :assets),
where: u.id == ^2 and a.id == ^1,
group_by: [c.id, u.id, r.id],
select: {u.email, u.id, r.name, c.name}
ある
に参加します正しいクエリ:
SELECT u0.email, u0.id, r2.name, c1.name, a6.asset_name , a6.id as asset_id
FROM users AS u0
INNER JOIN access_lists AS a4 ON a4.user_id = u0.id
INNER JOIN assets AS a6 ON a4.asset_id = a6.id
INNER JOIN companies AS c1 ON a4.company_id = c1.id
INNER JOIN roles AS r2 ON a4.role_id = r2.id
WHERE ((u0.id = 2) AND (a6.id = 1))
Group By u0.id, r2.id, c1.id, a6.id
ここでは、スキーマです:
する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 :roles, Db.Role, join_through: Db.AccessList
many_to_many :assets, Db.Asset, join_through: Db.AccessList
many_to_many :projects, Db.Project, join_through: Db.AccessList
many_to_many :companies, Db.Company, join_through: Db.AccessList
資産:
many_to_many :users, Db.User, join_through: Db.AccessList
many_to_many :companies, Db.Company, join_through: Db.AccessList
many_to_many :roles, Db.Role, join_through: Db.AccessList
many_to_many :projects, Db.Project, join_through: Db.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
役割:
many_to_many :users, Db.User, join_through: Db.AccessList
many_to_many :assets, Db.Asset, join_through: Db.AccessList
many_to_many :projects, Db.Project, join_through: Db.AccessList
many_to_many :companies, Db.Company, join_through: Db.AccessList
明示的エクトを助けるために、 'access_lists'に参加しようとする気にしませんか? – mudasobwa
アソシエーションはどのように宣言されていますか? –
@MikeBuhotそれらのすべては多くのものがたくさんあります。 –