【问题标题】:Where does this has_many through: association go wrong?这个 has_many through: 关联在哪里出错了?
【发布时间】:2018-01-25 00:34:39
【问题描述】:

期望的结果:

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

结果:

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

问题: 这个 has_many through: 关联在哪里出错了?这是正确的问题吗?

【问题讨论】:

  • 您是否尝试使用reload!重新加载控制台
  • 是的,我做了很多次,也退出并返回。检查了我出错的多个教程,但一切似乎都很好。

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


【解决方案1】:

item_ratings 不存在,但items_ratings 存在,尝试将所有出现的item_ratings 重命名为items_ratings

【讨论】:

  • 这是正确的,你应该把has_many :item_ratings改成has_many :items_ratings
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多