Robert
Robert

Reputation: 493

Where does this has_many through: association go wrong?

Desired outcome:

Item.first.ratings gives me the ratings of that item.

Desired tables and columns:

item
  id,name,created_at,updated_at
ratings
  id,name,created_at,updated_at
item_ratings
  id,item_id,rating_id,value,created_at,updated_at

ratings migration:

class CreateRatings < ActiveRecord::Migration[5.0]
  def change
    create_table :ratings do |t|
      t.string :name
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end

join table migration:

class CreateJoinTableItemsRatings < ActiveRecord::Migration[5.0]
  def change
    create_join_table :items, :ratings do |t|
      t.index [:item_id, :rating_id]
      t.index [:rating_id, :item_id]
      t.string :value
    end
  end
end

item model:

class Item < ApplicationRecord
   belongs_to :user
   has_many :item_ratings
   has_many :ratings, through: :item_ratings
end

rating model:

class Rating < ApplicationRecord
  belongs_to :user
  has_many :item_ratings
  has_many :items, through: :item_ratings
end

item_rating model:

class ItemRating < ApplicationRecord
  belongs_to :item
  belongs_to :rating
end
  1. rails console
  2. Item.first.ratings

result:

Item Load (0.7ms)  SELECT  "items".* FROM "items" ORDER BY "items"."created_at" DESC LIMIT $1  [["LIMIT", 1]]   
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "item_ratings" does not exist
    LINE 8:                WHERE a.attrelid = '"item_ratings"'::regclass
                                              ^
    :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                         pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
                 (SELECT c.collname FROM pg_collation c, pg_type t
                   WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation),
                         col_description(a.attrelid, a.attnum) AS comment
                    FROM pg_attribute a LEFT JOIN pg_attrdef d
                      ON a.attrelid = d.adrelid AND a.attnum = d.adnum
                   WHERE a.attrelid = '"item_ratings"'::regclass
                     AND a.attnum > 0 AND NOT a.attisdropped
                   ORDER BY a.attnum

Question: Where does this has_many through: association go wrong? Is this the right question to ask?

Upvotes: 2

Views: 83

Answers (1)

Stephan Meijer
Stephan Meijer

Reputation: 66

Table item_ratings does not exist but items_ratings does, try renaming all occurrences of item_ratings to items_ratings.

Upvotes: 3

Related Questions