Skip to content

Commit 148c03c

Browse files
authored
Allow 2-arity functions as preload function in Query (#4659)
1 parent 535b267 commit 148c03c

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

lib/ecto/query/builder/preload.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ defmodule Ecto.Query.Builder.Preload do
309309

310310
defp assert_query_or_fun!(%Ecto.Query{}, _key), do: :ok
311311
defp assert_query_or_fun!(fun, _key) when is_function(fun, 1), do: :ok
312+
defp assert_query_or_fun!(fun, _key) when is_function(fun, 2), do: :ok
312313

313314
defp assert_query_or_fun!(other, key) do
314315
raise ArgumentError,

test/ecto/query/builder/preload_test.exs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ defmodule Ecto.Query.Builder.PreloadTest do
6666
test "supports dynamics for join association bindings using named bindings" do
6767
comments = :comments
6868

69-
query =
70-
from p in "posts",
71-
join: c in assoc(p, :comments),
69+
query =
70+
from p in "posts",
71+
join: c in assoc(p, :comments),
7272
as: ^comments
7373
preloads = [
7474
comments: dynamic([{^comments, c}], c)
@@ -120,6 +120,18 @@ defmodule Ecto.Query.Builder.PreloadTest do
120120
preloads = [comments: outer_dynamic]
121121
assert %{preloads: [], assocs: [comments: {1, []}]} = preload(query, ^preloads)
122122
end
123+
124+
test "supports preload functions" do
125+
query = from p in "posts", join: c in assoc(p, :comments), as: :comments
126+
function_1 = fn _ -> [] end
127+
function_2 = fn _, _ -> [] end
128+
129+
preloads = [comments: function_1]
130+
assert %{preloads: ^preloads, assocs: []} = preload(query, ^preloads)
131+
132+
preloads = [comments: function_2]
133+
assert %{preloads: ^preloads, assocs: []} = preload(query, ^preloads)
134+
end
123135
end
124136

125137
describe "invalid preload" do
@@ -175,5 +187,13 @@ defmodule Ecto.Query.Builder.PreloadTest do
175187
preload(query, ^[comments: dynamic([_, c], c.field)])
176188
end
177189
end
190+
191+
test "raises when preload function has more than two arguments" do
192+
message = ~r"invalid preload for key `:comments`:"
193+
assert_raise ArgumentError, message, fn ->
194+
query = from p in "posts", join: c in assoc(p, :comments)
195+
preload(query, ^[comments: fn _, _, _ -> [] end])
196+
end
197+
end
178198
end
179199
end

0 commit comments

Comments
 (0)