Ecto Join Table 验证
Ecto Join Table Validation
我有一个名为 table 的连接:seasons_teams
schema "seasons_teams" do
field(:score, :integer)
belongs_to(:season, Season, foreign_key: :season_id, type: :binary_id)
belongs_to(:team, Team, foreign_key: :team_id, type: :binary_id)
timestamps()
end
这很好,但我想验证 season
和 team
的副本不存在。
例如:
%MyApp.SeasonsTeams{
__meta__: #Ecto.Schema.Metadata<:loaded, "seasons_teams">,
id: "89ec0dbd-cc61-4ba9-8dcf-b86b858d2882",
inserted_at: ~N[2019-11-10 00:58:27],
score: nil,
season: #Ecto.Association.NotLoaded<association :season is not loaded>,
season_id: "79c4bd04-d362-495c-ab13-649b299c23e2",
team: #Ecto.Association.NotLoaded<association :team is not loaded>,
team_id: "b6c408ef-d48e-4de9-8a46-8ae7bb12b699",
updated_at: ~N[2019-11-10 00:58:27]
},
%MyApp.SeasonsTeams{
__meta__: #Ecto.Schema.Metadata<:loaded, "seasons_teams">,
id: "89a7fc61-6ce4-4a6d-a9dc-8e3494378e33",
inserted_at: ~N[2019-11-10 00:58:37],
score: nil,
season: #Ecto.Association.NotLoaded<association :season is not loaded>,
season_id: "79c4bd04-d362-495c-ab13-649b299c23e2",
team: #Ecto.Association.NotLoaded<association :team is not loaded>,
team_id: "b6c408ef-d48e-4de9-8a46-8ae7bb12b699",
updated_at: ~N[2019-11-10 00:58:37]
}
您可以看到这两个记录具有相同的 season_id
和相同的 team_id
我不希望这成为可能。我很好奇 Phoenix/Elixir/Ecto 是否提供了一种处理这种情况的好方法?谢谢!
在跨越两个字段的 table 上创建一个唯一索引,并使用 unique_constraint
验证唯一约束:
# In the migration
create unique_index(:seasons_teams, [:season_id, :team_id], name: :seasons_teams_season_id_team_id_index)
# In the changeset function
cast(season_team, params, [:season_id])
|> unique_constraint(:season_id, name: :seasons_teams_season_id_team_id_index)
我有一个名为 table 的连接:seasons_teams
schema "seasons_teams" do
field(:score, :integer)
belongs_to(:season, Season, foreign_key: :season_id, type: :binary_id)
belongs_to(:team, Team, foreign_key: :team_id, type: :binary_id)
timestamps()
end
这很好,但我想验证 season
和 team
的副本不存在。
例如:
%MyApp.SeasonsTeams{
__meta__: #Ecto.Schema.Metadata<:loaded, "seasons_teams">,
id: "89ec0dbd-cc61-4ba9-8dcf-b86b858d2882",
inserted_at: ~N[2019-11-10 00:58:27],
score: nil,
season: #Ecto.Association.NotLoaded<association :season is not loaded>,
season_id: "79c4bd04-d362-495c-ab13-649b299c23e2",
team: #Ecto.Association.NotLoaded<association :team is not loaded>,
team_id: "b6c408ef-d48e-4de9-8a46-8ae7bb12b699",
updated_at: ~N[2019-11-10 00:58:27]
},
%MyApp.SeasonsTeams{
__meta__: #Ecto.Schema.Metadata<:loaded, "seasons_teams">,
id: "89a7fc61-6ce4-4a6d-a9dc-8e3494378e33",
inserted_at: ~N[2019-11-10 00:58:37],
score: nil,
season: #Ecto.Association.NotLoaded<association :season is not loaded>,
season_id: "79c4bd04-d362-495c-ab13-649b299c23e2",
team: #Ecto.Association.NotLoaded<association :team is not loaded>,
team_id: "b6c408ef-d48e-4de9-8a46-8ae7bb12b699",
updated_at: ~N[2019-11-10 00:58:37]
}
您可以看到这两个记录具有相同的 season_id
和相同的 team_id
我不希望这成为可能。我很好奇 Phoenix/Elixir/Ecto 是否提供了一种处理这种情况的好方法?谢谢!
在跨越两个字段的 table 上创建一个唯一索引,并使用 unique_constraint
验证唯一约束:
# In the migration
create unique_index(:seasons_teams, [:season_id, :team_id], name: :seasons_teams_season_id_team_id_index)
# In the changeset function
cast(season_team, params, [:season_id])
|> unique_constraint(:season_id, name: :seasons_teams_season_id_team_id_index)