这有什么地方通过:协会出错?

时间:2018-01-24 16:03:41

标签: ruby-on-rails has-many-through

期望的结果:

Item.first.ratings为我提供了该项目的评分。

所需的表格和列:

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

评级迁移:

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

加入表格迁移:

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

项目模型:

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

评级模型:

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

item_rating模型:

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

    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
    

    问题: 这有什么地方通过:协会出错?这是正确的问题吗?

1 个答案:

答案 0 :(得分:3)

item_ratings不存在但items_ratings确实存在,请尝试将所有item_ratings重命名为items_ratings