Rails:违反外键约束

9

我有三个模型:BookgenreBookGenre,它们之间存在以下关系:

class BookGenre < ActiveRecord::Base
  belongs_to :book
  belongs_to :genre
end


class Book < ActiveRecord::Base
  has_many :book_genres
  has_many :genres, through: :book_genres
end


class Genre < ActiveRecord::Base
  has_many :book_genres
  has_many :books, through: :book_genres
end

接下来我使用seed文件将数据放入这些表中。

但当我想再次执行rake db:seed时,它显示了以下错误

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:  update or delete on table "books" violates foreign key constraint "fk_rails_4a117802d7" on table "book_genres"
DETAIL:  Key (id)=(10) is still referenced from table "book_genres".

在我的 seed.rb 文件中。
Book.destroy_all
Genre.destroy_all
...create data 

太好了!你非常帮忙,谢谢。 - rj487
2个回答

15
在您的has_many定义中添加dependent: :destroy选项。
请参阅文档: Check docs 为了尊重数据完整性,更好的选择是在数据库级别上设置CASCADE DELETE :例如,您有一个comments表和一个users表。用户有很多评论,您想在comments表中添加外键,并在删除用户时删除评论,可以使用以下方法(on_delete: :cascade选项将确保这一点):
add_foreign_key(
  :comments,
  :users,
  column:
  :user_id,
  on_delete: :cascade
)

你如何在数据库层面上设置它? - Jonathan Tuzman
1
@JonathanTuzman add_foreign_key( :comments, :users, column: :user_id, on_delete: :cascade ) - Andrey Deineko

9

试试这个:

ActiveRecord::Base.connection.disable_referential_integrity do
    Book.destroy_all
    Genre.destroy_all
    # ...create data 
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接