我是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关联的帖子他们,不是吗?
我做了如上所述,但即使我有相关的评论,我仍然可以销毁这些帖子。我该怎么对待它?我做错了什么?
干杯
答案 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