代码之家  ›  专栏  ›  技术社区  ›  Robert

这件事发生在哪里:联想出了问题?

  •  2
  • Robert  · 技术社区  · 8 年前

    预期结果:

    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\u评级模型:

    class ItemRating < ApplicationRecord
      belongs_to :item
      belongs_to :rating
    end
    
    1. rails console
    2. 项目第一评级

    结果:

    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 回复  |  直到 8 年前
        1
  •  3
  •   Stephan Meijer    8 年前

    桌子 item_ratings 不存在,但 items_ratings 是否尝试重命名所有出现的 item\u评级 到 items\u评级 .