ActiveRecord::StatementInvalid PG::UndefinedColumn: ERROR ActiveRecord出现了错误:语句无效,PG数据库不能找到指定的列。

7
我是使用rails_admin进行管理面板。只需更改Image模型中的关联即可。
从这个开始
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

当我尝试从管理面板编辑用户时,遇到了这个错误。但是从其他方面来看,它运行良好。

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" = $1...
                                         ^
: SELECT  "users".* FROM "users" WHERE "users"."image_id" = $1 LIMIT $2
2个回答

2
Rails文档很棒。 has_one的文档在这里找到,指出“仅当另一个类包含外键时才应使用此方法”,因此它正在查找user记录上的image_id的外键。您可以通过迁移创建此内容;有关外键和迁移的更多信息,请参见此stack overflow帖子
但在您走得那么远之前,请考虑以下几点:
  • 为什么要将图像关系从belongs_to :user更改为has_one :user?Boil down SQL associations以及Rails如何映射它们,如果用户has_many:images,则图像必须是belong_to用户;它们是关系的相反面,除了has_and_belongs_to_many关系之外。如果A属于B,则B有一个(或多个)A。我强烈建议您保留图像具有belongs_to关系,而User和Product可以have_many图像。为了轶闻地解释为什么这是有意义的:用户可能会有自己的面部照片,房屋等(has_many:images)。产品可能会有相同鞋子的多张图片(has_many:images),但特定的鞋子图片很难同时映射到用户和产品。
  • 我强烈建议您使用像attachinarypaperclip这样的gem来管理图像和附件。如果您正在处理上传的文件附件,则如此类库将在将来处理调整大小,图像压缩等方面为您节省麻烦。我相信,尝试更改关系的方向是受到这些宝石将为您解决的某些问题的启发。

我理解了你的解释,但我正在使用单个图像表来存储用户和产品。用户图像在新建用户和编辑用户时保存,产品也是如此。用户最多可以有3张图片。用户和产品之间没有直接关系,就像这样:用户->商店->产品。但是,当我为用户和产品都使用belongs_to时,它们的ID在图像表中是必需的,而这不是我想要的。如果用户保存了一张图片,那么在图像表中product_id将为空,反之亦然,并且这在belongs_to的情况下不会发生。 - Tanay Sharma
这很有道理,一个图像表是很好的设计;在这种情况下,您可能需要拥有一个交叉表,列为“实体,实体ID,图像ID”。实体将是类名和ID,因此一行将是类似于“用户,1,2”的东西,其中1是user_id,2是image_id。我再次鼓励您使用像Attachinary这样的工具,它可以为您处理所有这些设置。 - quetzaluz
还有一点需要注意的是,“has_many”也需要一个“through:”声明。更多信息请参见:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association - quetzaluz
太棒了!这个指南详细介绍了如何使用paperclip:https://github.com/thoughtbot/paperclip#quick-start实际上,用户和产品都应该有has_attached_file:image,然后你就可以开始了。 - quetzaluz
1
只是一个小小的Rails 5技巧class Image < ApplicationRecord belongs_to :user belongs_to :product, optional: true end这对我很有效,感谢你的帮助。 - Tanay Sharma
显示剩余2条评论

0

检查大小写

我之所以来到这里,是因为我在列名中使用了错误的大小写。

该列名为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")立即解决了问题。

检查引号

还要注意,在使用双引号时,PostgreSQL是不会容忍错误的。

检查列名的大小写

更多信息请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接