diff --git a/lib/ecto_ranked.ex b/lib/ecto_ranked.ex index fab466b..f315eeb 100644 --- a/lib/ecto_ranked.ex +++ b/lib/ecto_ranked.ex @@ -57,7 +57,7 @@ defmodule EctoRanked do {min, max} = find_neighbors(cs, options, number) rank_between(cs, options, min, max) nil -> - if get_field(cs, options.rank_field) && (get_change(cs, options.rank_field) || !options.scope_field || !get_change(cs, options.scope_field)) do + if get_field(cs, options.rank_field) && (get_change(cs, options.rank_field) || !options.scope_field || !changes_to_scope_fields(cs, options.scope_field)) do cs else update_index_from_position(cs, options, "last") @@ -66,6 +66,16 @@ defmodule EctoRanked do end end + defp changes_to_scope_fields(cs, scope_field) when is_list(scope_field) do + Enum.any? scope_field, fn field -> + changes_to_scope_fields(cs, field) + end + end + + defp changes_to_scope_fields(cs, scope_field) do + get_change(cs, scope_field) + end + defp rank_between(cs, options, min, max) do rank = EctoRanked.Utils.ceiling((max - min) / 2) + min rank_at(cs, options, rank) diff --git a/mix.exs b/mix.exs index 8510c1c..727370c 100644 --- a/mix.exs +++ b/mix.exs @@ -3,7 +3,7 @@ defmodule EctoRanked.Mixfile do def project do [app: :ecto_ranked, - version: "0.1.5", + version: "0.1.6", elixir: "~> 1.4", build_embedded: Mix.env == :prod, start_permanent: Mix.env == :prod, diff --git a/test/multiple_scope_test.exs b/test/multiple_scope_test.exs index 641caf5..41d3cbd 100644 --- a/test/multiple_scope_test.exs +++ b/test/multiple_scope_test.exs @@ -23,4 +23,35 @@ defmodule EctoRanked.MultipleScopeTest do assert ranked_ids(1, 1) == [group1_model1.id, group1_model2.id, group1_model3.id] assert ranked_ids(1, 2) == [group2_model2.id, group2_model1.id, group2_model3.id] end + + test "moving between scopes" do + group1_model1 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + group1_model2 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + group1_model3 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + + group2_model1 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + group2_model2 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + group2_model3 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + + group1_model2 |> MultiScopeModel.changeset(%{position: 1, second_scope: 2}) |> Repo.update + + assert ranked_ids(1, 1) == [group1_model1.id, group1_model3.id] + assert ranked_ids(1, 2) == [group2_model1.id, group1_model2.id, group2_model2.id, group2_model3.id] + end + + test "moving to a new scope" do + group1_model1 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + group1_model2 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + group1_model3 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 1}) |> Repo.insert! + + group2_model1 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + group2_model2 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + group2_model3 = %MultiScopeModel{} |> MultiScopeModel.changeset(%{first_scope: 1, second_scope: 2}) |> Repo.insert! + + group1_model2 |> MultiScopeModel.changeset(%{first_scope: 2}) |> Repo.update + + assert ranked_ids(1, 1) == [group1_model1.id, group1_model3.id] + assert ranked_ids(1, 2) == [group2_model1.id, group2_model2.id, group2_model3.id] + assert ranked_ids(2, 1) == [group1_model2.id] + end end