(Phoenix 1.6.6, Ecto 3.7.2, Elixir 1.13)
When building the custom Survey context, we are told to then update the rating.ex file with the following:
schema "ratings" do
field :stars, :integer
belongs_to :user, User
belongs_to :product, Product
timestamps()
end
then, to update our changeset
def changeset(rating, attrs) do
rating
|> cast(attrs, [:stars, :user_id, :product_id])
|> validate_required([:stars, :user_id, :product_id])
|> validate_inclusion(:stars, 1..5)
|> unique_constraint(:product_id, name: :index_ratings_on_user_product)
end
After, we then update demographic.ex with similar changes, we are told to mix.ecto.migrate - but I get this error:
Compiling 2 files (.ex)
warning: invalid association `product` in schema Pento.Survey.Rating: associated schema Product does not exist
lib/pento/survey/rating.ex:1: Pento.Survey.Rating (module)
However, the requisite migration files etc. are still updated.
Creating a Survey rating in IEX works but shows these curious AssociationNotLoaded entries for Product & User:
%Pento.Survey.Rating{
__meta__: #Ecto.Schema.Metadata<:loaded, "ratings">,
id: 1,
inserted_at: ~N[2022-04-13 18:57:09],
product: #Ecto.Association.NotLoaded<association :product is not loaded>,
product_id: 1,
stars: 5,
updated_at: ~N[2022-04-13 18:57:09],
user: #Ecto.Association.NotLoaded<association :user is not loaded>,
user_id: 1
}}
All seems fine until you create the the query.ex for Demographic & then spin it in IEX , which never finds the “user function” (Survey.get_demographic_by_user).
iex(2)> Survey.get_demographic_by_user(user)
** (CompileError) iex:2: undefined function user/0 (there is no such import)
If you try to proceed further anyways by use the Catalog.list_products_with_user_rating function in IEX, we get this error:
Catalog.list_products_with_user_rating(user)
** (UndefinedFunctionError) function Pento.Survey.Rating.Query.preload_user/1 is undefined (module Pento.Survey.Rating.Query is not available)
Pento.Survey.Rating.Query.preload_user(#Pento.Accounts.User<__meta__: #Ecto.Schema.Metadata<:loaded, "users">, confirmed_at: nil, email: "mercutio@grox.io", id: 1, inserted_at: ~N[2022-04-08 22:24:37], updated_at: ~N[2022-04-08 22:24:37], username: nil, ...>)
lib/pento/catalog/product/query.ex:15: Pento.Catalog.Product.Query.preload_user_ratings/2
(pento 0.1.0) lib/pento/catalog.ex:106: Pento.Catalog.list_products_with_user_rating/1
It seems that the User & Product schemas relating to the belong_to are not being recognized in the Rating schema (?)
Is there a piece to this puzzle I’m missing? Everything up until this point in the book has gone off without a hitch with no errors & the Product & User schemas definitely exist.
I even tried switching the ordering of product & user in the belong_to in Rating schema to see if that helped, but got the same error but in reverse:
Compiling 2 files (.ex)
warning: invalid association `user` in schema Pento.Survey.Rating: associated schema User does not exist
lib/pento/survey/rating.ex:1: Pento.Survey.Rating (module)
Any help to move past this would be great, as I am currently roadblocked - otherwise an excellent book! Thank you