Ok, so I have these schemas
schema "players" do
field :email, :string
has_many :profiles, MyApp.Profile
has_many :worlds, through: [:profiles, :world]
end
schema "worlds" do
field :name, :string
has_many :profiles, MyApp.Profile
has_many :players, through: [:profiles, :player]
end
schema "settings" do
field :mode, :string
belongs_to :player, MyApp.Player
belongs_to :world, MyApp.World
end
(You might notice that this is a poorly designed database relationship, but this is really what I’m dealing with right now)
All players are supposed to have one settings in each world they create by default. But due to logical errors in our code, some players didn’t have settings in some world.
Now I’m trying to find those players
who don’t have existing settings
record in some world so I can create default settings for them using a seeder.
I’ve tried workaround like this
query = from profile in Profile
query
|> Repo.all()
|> Enum.each(fn profile ->
case Settings.get_settings(profile.player_id, profile.world_id) do
nil ->
Settings.create_settings(profile.player_id, profile.world_id)
_ ->
:ok
end
end)
It works but I want to avoid using the case statement. It costs a lot of database work.
Is there any way to fetch those players
with no existing settings
record in some worlds
using a query?
I find this question quite similar to mine. I tried to write it in elixir and with ecto fragment but I can’t make it work.
Please help me.