避免用外键破坏

时间:2017-02-06 10:57:19

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

我是Ruby on Rails的新手。我不明白rails如何使用外键,我已经研究了几天但我没有得到答案。

简单样本:

我创建了两个表:

class CreatePosts < ActiveRecord::Migration
 def change
  create_table :posts do |t|
   t.string :title
   t.text :content
   t.timestamps null: false
  end
 end
end


class CreateComments < ActiveRecord::Migration
 def change
  create_table :comments do |t|
   t.string :author
   t.text :content
   t.references :post, index: true, foreign_key: true
   t.timestamps null: false
  end
 end
end

我的模特是:

class Post < ActiveRecord::Base
  has_many :comments
end

class Comments < ActiveRecord::Base
 belongs_to :post
end

我的疑问是:因为我在我的表中有一个外键COMMENTS(.references:post,index:true,foreign_key:true)我想我无法销毁任何与任何COMMENTS关联的帖子他们,不是吗?

我做了如上所述,但即使我有相关的评论,我仍然可以销毁这些帖子。我该怎么对待它?我做错了什么?

干杯

2 个答案:

答案 0 :(得分:1)

我会优化您的迁移,以便在外键上使用:on_delete选项。它可以采用其中一个值::nullify, :cascade, :restrict

据我了解,您需要在:restrict表的post_id列中将此值设置为comments,以便无法删除包含相关评论的帖子。< / p>

更新: 或者,您也可以直接在Post模型中的关联中设置它:

has_many :comment, dependent: :restrict_With_error

请看一下: 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 - &gt;请参阅选项:部分

答案 1 :(得分:0)

根据我的理解,如果有关联post,你不想销毁comments

为什么不将[{1}}封装为if statement

的删除按钮

类似于:

psudo代码

post