2017-11-03 8 views
0

関連付けられているタスクなしで投稿を破棄したいと考えています。しかし、私は現在、言うSQLエラー直面しています:関連するタスクのない投稿を削除する

ActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed: DELETE FROM "posts" WHERE "posts"."id" = ?): 

いくつか検索した後に、私は団体や外部キーから来て見ました。しかし、私は今問題を解決することはできません。

私は(オプション:真)を私のモデルに入れてテストしました。

外部キーを(、on_delete::cascade)&(、on_delete::nullify)に変更しようとしましたが、まだ動作していません。

私のコードは=

//Post Model 
class Post < ApplicationRecord 
    has_one :task 
end 

//Task Model 
class Task < ApplicationRecord 
    belongs_to :post, optional: true 
end 

を破壊するために:

//Destroy_one into the Post Controller 
def destoy_one 
    @post.destroy 
end 

移行ファイル:(もon_deleteで試してみました:無効)

class EditForeightKeys < ActiveRecord::Migration[5.1] 
    def change 
    # remove the old foreign_key 
    remove_foreign_key :tasks, :post 

    # add the new foreign_key 
    add_foreign_key :tasks, :post, on_delete: :cascade 

    end 
end 

をあなたがのために他のソリューションを持っていますかそれ ?

+0

あなたは@ post.deleteを試しましたか? – krishnar

+0

こんにちは@krishnar、もう一度あなたを見て幸せ!タスク、:、on_deleteポスト::このソリューション@jacquesMesnetため –

+0

ただまあ、私は正確に問題 – nikolay

答えて

1

このような投稿モデル:

default_scope { where(deleted_state: false) } 

問題なく働く!

+0

感謝を無効化、それはエレガントなソリューションですうん、絶対に –

0

バリアントとしてUserのためのアクションを破壊する上でコールバックを使用することができます:あなたにデフォルトのスコープを置くことができ、私は投稿

def destroy_one 
    @post.update(deleted_state: true) 
end 

そして後にdeleted_stateを実装することにより、この問題を解決する

class Post 
    before_destroy :update_tasks 

    private 

    def update_tasks 
     self.tasks.update_all(post_id: nil) 
    end 
end 
関連する問題