Rails 4 x postgresql:ActiveRecord :: InvalidForeignKey

时间:2016-01-20 02:36:22

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord foreign-keys

在我使用postgresql的Rails 4应用中,我遇到了一个我似乎无法理解的错误:

Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.2ms)

ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR:  insert or update on table "comments" violates foreign key constraint "fk_rails_2fd19c0db7"
DETAIL:  Key (commentable_id)=(52) is not present in table "posts".
: INSERT INTO "comments" ("body", "commentable_id", "commentable_type", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"):
  app/controllers/comments_controller.rb:52:in `block in create'
  app/controllers/comments_controller.rb:51:in `create'

这是来自comments_controller.rb的代码:

def create
    @commentable = load_commentable
    @comment = @commentable.comments.build(comment_params)
    @comment.user_id = current_user.id
    respond_to do |format|
      if @comment.save
        format.html { redirect_to :back }
        format.json { render :show, status: :created, location: @comment }
        format.js
      else
        format.html { render :new }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

以下是路线的设置方式:

resources :posts, shallow: true do
  resources :comments, shallow: true
end
resources :ads, shallow: true do
  resources :comments, shallow: true
end

具有多态关联:

class Post < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
end

class Ad < ActiveRecord::Base
  has_many :comments, as: :commentable, dependent: :destroy
end

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

- - - -

更新:

根据@ RuNpiXelruN的请求,这里是注释的数据库架构:

create_table "comments", force: :cascade do |t|
  t.integer  "user_id"
  t.string   "body"
  t.datetime "created_at",       null: false
  t.datetime "updated_at",       null: false
  t.integer  "commentable_id"
  t.string   "commentable_type"
end

  create_table "ads", force: :cascade do |t|
    t.string   "campaign"
    t.string   "text"
    t.string   "headline"
    t.text     "description"
    t.string   "url"
    t.string   "cta"
    t.text     "context"
    t.string   "status"
    t.string   "approval"
    t.integer  "calendar_id"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
  end

create_table "posts", force: :cascade do |t|
    t.integer  "calendar_id"
    t.datetime "date"
    t.string   "subject"
    t.string   "format"
    t.text     "copy"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
    t.string   "short_copy"
    t.integer  "score"
    t.boolean  "facebook"
    t.boolean  "twitter"
    t.boolean  "instagram"
    t.boolean  "pinterest"
    t.boolean  "google"
    t.boolean  "linkedin"
    t.boolean  "tumblr"
    t.boolean  "snapchat"
    t.string   "approval"
  end

- - - -

如何修复日志中出现的错误?

1 个答案:

答案 0 :(得分:5)

当您尝试使用commentable_id = 52添加评论时,错误告诉您数据库中不存在id = 52的帖子。我猜这个列曾经是post_id,当你交换到多态可评论关系时,它在迁移中被重命名了?如果是这样,我认为您的数据库中仍然存在外键约束,并且需要将其删除。