carlomunguia

carlomunguia

Programming Phoenix LiveView: pg 222(epub) invalid association `product` in schema Pento.Survey.Rating: associated schema Product does not exist lib/pento/survey/rating.ex:1: Pento.Survey.Rating (module)

(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

Marked As Solved

carlomunguia

carlomunguia

UPDATE: This was fixed by:

  • Deleting ratings table & rating.ex file

  • Re-running context gen command for Rating

  • Updating the schema in rating.ex to the following:

belongs_to: :user, Pento.Accounts.User
belongs_to: :product, Pento.Catalog.Product
  • Update changeset along with the book

  • Re-run mix ecto.migrate

  • Keep all other files i.e. demographics etc. the same

Now all associations are loaded in survey/query & product/query correctly.
I’m not sure why the association has to be explicit in this case, but I’m finally to be free from the roadblock - FYI if you happen to see anything like this in future, Sophie/Bruce and all other readers.

Where Next?

Popular Pragmatic Bookshelf topics Top

abtin
page 20: … protoc command… I had to additionally run the following go get commands in order to be able to compile protobuf code using go...
New
Alexandr
Hi everyone! There is an error on the page 71 in the book “Programming machine learning from coding to depp learning” P. Perrotta. You c...
New
jdufour
Hello! On page xix of the preface, it says there is a community forum "… for help if your’re stuck on one of the exercises in this book… ...
New
herminiotorres
Hi @Margaret , On page VII the book tells us the example and snippets will be all using Elixir version 1.11 But on page 3 almost the en...
New
raul
Hi Travis! Thank you for the cool book! :slight_smile: I made a list of issues and thought I could post them chapter by chapter. I’m rev...
New
New
Charles
In general, the book isn’t yet updated for Phoenix version 1.6. On page 18 of the book, the authors indicate that an auto generated of ro...
New
dsmith42
Hey there, I’m enjoying this book and have learned a few things alredayd. However, in Chapter 4 I believe we are meant to see the “&gt;...
New
AufHe
I’m a newbie to Rails 7 and have hit an issue with the bin/Dev script mentioned on pages 112-113. Iteration A1 - Seeing the list of prod...
New
rainforest
Hi, I’ve got a question about the implementation of PubSub when using a Phoenix.Socket.Transport behaviour rather than channels. Before ...
New

Other popular topics Top

PragmaticBookshelf
Stop developing web apps with yesterday’s tools. Today, developers are increasingly adopting Clojure as a web-development platform. See f...
New
New
AstonJ
This looks like a stunning keycap set :orange_heart: A LEGENDARY KEYBOARD LIVES ON When you bought an Apple Macintosh computer in the e...
New
DevotionGeo
The V Programming Language Simple language for building maintainable programs V is already mentioned couple of times in the forum, but I...
New
rustkas
Intensively researching Erlang books and additional resources on it, I have found that the topic of using Regular Expressions is either c...
New
AstonJ
We’ve talked about his book briefly here but it is quickly becoming obsolete - so he’s decided to create a series of 7 podcasts, the firs...
New
PragmaticBookshelf
Rails 7 completely redefines what it means to produce fantastic user experiences and provides a way to achieve all the benefits of single...
New
PragmaticBookshelf
Develop, deploy, and debug BEAM applications using BEAMOps: a new paradigm that focuses on scalability, fault tolerance, and owning each ...
New
PragmaticBookshelf
A concise guide to MySQL 9 database administration, covering fundamental concepts, techniques, and best practices. Neil Smyth MySQL...
New
Fl4m3Ph03n1x
Background Lately I am in a quest to find a good quality TTS ai generation tool to run locally in order to create audio for some videos I...
New

Sub Categories: