2017-02-06 10 views
0

Ruby on Railsの新機能です。私は外国のキーを使ってレールがどのように動作するのか理解していない、私は数日間それを研究したが、私は答えを得ていない。外部キーでの破壊を避ける

Simpleサンプル:

私は2つのテーブルを作成:

​​

を私のモデルは以下のとおりです。

class Post < ActiveRecord::Base 
    has_many :comments 
end 

class Comments < ActiveRecord::Base 
belongs_to :post 
end 

私の疑いがある:私は私のテーブルのコメント(の外部キーを持っています。参照:post、index:true、foreign_key:true)私は、それらに関連付けられたCOMMENTSを持つ投稿を破棄することはできないと思いますか?

私は上記のようにしましたが、コメントが関連付けられていても投稿を破棄することができます。どうすればそれを扱うことができますか?私は間違って何をしていますか?

乾杯

+0

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many]> [オプション]を参照してください。また、SQL LITEを使用しています。私は.schemaをチェックするとFK doesn; tが作成されたようです: – Costa

+0

sqlite> .schema投稿 CREATE TABLE "posts"( "id" INTEGER PRIMARY KEY AUTOINCREMENT NULLでない、 "ti tle "varchar、" content "テキスト、" created_at "datetime NOT NULL、" updated_at "datetime NOT NULL); – Costa

+0

CREATE TABLE "comments"( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL、 "author" varchar、 "content" text、 "post_id" integer、 "created_at" datetime NOT NULL、 "updated_at" datetime NOT NULL); CREATE INDEX "index_comments_on_post_id" ON "comments"( "post_id"); – Costa

答えて

0

私が理解から、あなたがcommentsが関連付けられている場合postを破壊したくありませんか?

なぜpost

ための削除ボタンを封入しif statementだから何かのように入れていない:

psudoコード

if @post.comments exists 
    cant delete post 
else 
    delete post 
end 
0

私は:on_deleteオプションを使用するように移行を絞り込むたいあなたの外来キーに。あなたは、関連するコメントを投稿は削除できないように、あなたのcomments表でごpost_id列に:restrictにこの値を設定する必要があり、私が理解から:nullify, :cascade, :restrict

:それは、これらの値のいずれかを取ることができます。

更新: それとも、あなたが直接あなたのPostモデルに関連にそれを設定できます

has_many :comment, dependent: :restrict_With_error 

を見てみてください: - :セクション

関連する問題