ActiveRecord::StatementInvalid PG::UndefinedColumn: 错误

ActiveRecord::StatementInvalid PG::UndefinedColumn: ERROR

我正在使用 rails_admin 作为管理面板。只需更改图像模型中的关联

由此

class Image < ApplicationRecord
   belongs_to :user 
   belongs_to :product 
end

至此

class Image < ApplicationRecord
   has_one :user 
   has_one :product 
end

并且用户模型是

class User < ApplicationRecord
   has_many :images,dependent: :destroy
end

当我尝试从管理员 panel.From 编辑用户时出现此错误,但它工作正常。

ActiveRecord::StatementInvalid at /user/72/edit

PG::UndefinedColumn: ERROR:  column users.image_id does not exist
LINE 1: SELECT  "users".* FROM "users" WHERE "users"."image_id" = ...
                                         ^
: SELECT  "users".* FROM "users" WHERE "users"."image_id" =  LIMIT 

Rails 有很棒的文档。 has_one found here states that "This method should only be used if the other class contains the foreign key" so it is looking for the foreign key of image_id on the user record. You would create this through a migration; please see this stack overflow post 的文档以获取有关外键和迁移的更多信息。

但在你走那么远之前,请考虑:

  • 为什么要将图像关系从 belongs_to :user 更改为 has_one :user 第一名?要归结 SQL 关联以及 Rails 如何映射到它们,如果用户 has_many :images 那么图像必须 belong_to 用户;他们是关系的对立面,有一个 异常是 has_and_belongs_to_many 关系。如果 A 属于 B,则 B 有一个(或多个)A。我强烈建议您保持图像具有 belongs_to 关系,而用户和产品可以 have_many 图像。有趣地解释为什么这是有道理的:用户可能有他们的脸、他们的房子等的个人资料照片 (has_many :images)。一件产品(鞋子)可能有同一只鞋子的多张图片 (has_many :images),但一张鞋子的特定图片不太可能同时映射到用户和产品。
  • 我强烈建议您使用像 attachinary or paperclip 这样的 gem 来管理图像和附件。如果您正在处理上传的文件附件,像这样的库将在调整大小、图像压缩等方面为您省去麻烦。我相信您尝试更改关系的方向是由这些问题中的一些问题告知的gems会为你解决。

检查大小写

我来到这里是因为我在列名称中使用了错误的大写字母。

专栏是advertiserName,我在做

Listing.where(AdvertiserName: "Lowes")
Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column listings.AdvertiserName does not exist)
LINE 1: SELECT "listings".* FROM "listings" WHERE "listings"."Advert...

将查询更改为 Listing.where(advertiserName: "Lowes") 立即修复。

查看报价

Note also PostgreSQL 在

中使用双引号时不容忍

检查列名的大小写

查看更多信息 here