ActiveRecord :: StatementInvalid PG :: UndefinedColumn:ERROR

时间:2017-02-01 12:50:10

标签: ruby-on-rails rails-activerecord ruby-on-rails-5 rails-admin

我正在使用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

当我尝试从管理面板编辑用户时出现此错误。从另一方面它正常工作。

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

1 个答案:

答案 0 :(得分:1)

Rails有很棒的文档。 has_one found here的文档声明&#34;只有在其他类包含外键时才会使用此方法&#34;所以它正在image_id记录中查找user的外键。你可以通过迁移来创建它;有关外键和迁移的更多信息,请参阅此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),但鞋子的特定图片不太可能映射到用户和产品。
  • 我强烈建议您使用attachinarypaperclip等宝石来管理图片和附件。如果您正在处理上传的文件附件,那么这样的图书馆可以帮助您避免在调整大小,图像压缩等方面遇到麻烦。我相信您尝试更改关系的方向是由一些问题告知的这些宝石会为你解决。