【发布时间】:2015-10-13 19:12:34
【问题描述】:
我正在建立一个涉及定向友谊关系的 Rails 网站。我知道在模型级别,它是一个自引用关联。并且有类似has_and_belongs_to 的方法用于该关联。
我的问题是:如何为这个关系设置数据库级别的约束。我猜迁移会是这样的,它使用外键来保证引用完整性:
class CreateFriendships < ActiveRecord::Migration
def change
create_table :friendships do |t|
t.belongs_to :user, null: false, foreign_key: true
t.belongs_to :user, null: false, foreign_key: true
t.integer :accepted, null: false, default: 0
end
end
但是当我运行rake db:migrate 时,它有错误:
PG::DuplicateObject: ERROR: constraint "fk_friendships_user_id" for relation "friendships" already exists
事实上,我什至不确定在这种情况下是否需要设置数据库约束,因为我看到有些人的友谊关系实现没有数据库约束:
create_table :friendships do |t|
t.integer :user_id
t.integer :friend_id
t.timestamps
end
根据 Rails 指南
Active Record 方式声称智能属于您的模型,而不是数据库。因此,触发器或约束等将部分智能推送回数据库的功能并未得到大量使用。
我不确定在这种情况下是否大量使用了数据库约束。
那么在这种情况下,我真的有必要设置数据库级别的约束(使用外键)吗?或者我只需要实现模型级别的约束?谢谢!!
【问题讨论】:
-
你说不行。什么不起作用?执行特定操作后是否收到特定的错误消息?
-
感谢您的评论。我已将该错误消息添加到我的问题中。
标签: ruby-on-rails ruby database