2012-09-16 29 views
8

Theo http://www.yesodweb.com/blog/2010/07/database-migrations một DeleteCascade typeclass đã được thêm vào một vài năm trước đây. Tôi chỉ có thể giả định rằng điều này có nghĩa là để được thêm vào các mô hình. Sau khi thiết lập mô hình của tôi, hãy định cấu hình như sau:Yesod delete cascade

Field 
    ... 
    foreignId ForeignId DeleteCascade 

đơn đăng ký của tôi biên dịch tốt. nhưng lược đồ DB không thay đổi và xóa cũng không bị ứng dụng xếp chồng. Tôi có nên chỉ (rùng mình) làm điều đó theo cách thủ công không? Có cách nào tốt hơn?

Tôi đang sử dụng giàn giáo Yesod (Application.hs, Foundation.hs, Settings.hs, ...)

Trả lời

8

Sử dụng các câu trả lời hiện có, phải mất một chút thời gian để tôi tìm hiểu cách sử dụng xóa tầng. Là một người mới bắt đầu ở Yesod, tôi không có cái nhìn tổng quan về Yesod.

Để có một chuỗi xóa hoạt động, bạn không cần thay đổi bất kỳ thứ gì trong mô hình. Giả sử tệp thực thể của bạn trông giống như sau và bạn muốn xóa Entry.

Entry 
    title Text 
Comment 
    entry EntryId 

Bạn không phải thay đổi tệp thực thể này.

Mã từ nơi bạn lãnh đạo các thực thể, thường là ở Model.hs, trông giống như vậy.

share [ mkPersist sqlOnlySettings 
     , mkMigrate "migrateAll" ] 
    $(persistFileWith lowerCaseSettings "config/models") 

Thêm mkDeleteCascade để nhận các trường hợp DeleteCascades cho các thực thể của bạn.

share [ mkPersist sqlOnlySettings 
     , mkDeleteCascade sqlOnlySettings 
     , mkMigrate "migrateAll" ] 
    $(persistFileWith lowerCaseSettings "config/models") 

Khi bạn muốn xóa bài viết này, ví dụ như trong postDeleteEntryR Handler bạn phải sử dụng deleteCascade hoặc deleteCascadeWhere thay vì xóa.

runDB $ deleteCascade entryId 

Sử dụng delete có cùng tác dụng như trước.

4

Để tận dụng lợi thế của DeleteCascade, bạn cần phải sử dụng một trong hai deleteCascade hoặc deleteCascadeWhere chức năng . Chúng sẽ chỉ hoạt động nếu có các cá thể DeleteCascade có sẵn cho các kiểu của bạn. Cách dễ nhất để có được điều này là với hàm mkDeleteCascade.

+0

Cảm ơn bạn đã trả lời. Bạn có thể mở rộng một chút không? Vấn đề của tôi: http://hackage.haskell.org/packages/archive/persistent-template/1.0.0/doc/html/Database-Persist-TH.html nói rằng người dùng thông thường không cần sử dụng mkDeleteCascade. http://hackage.haskell.org/packages/archive/persistent/1.0.0/doc/html/src/Database-Persist-Query-Internal.html nói rằng deleteCascadeWhere chỉ dành cho mục đích sử dụng nội bộ. Tôi cũng không thể tìm thấy bất kỳ tài liệu hữu ích nào trên deleteCascade. Bạn có thể hiển thị/chỉ cho tôi một ví dụ làm việc tối thiểu về điều này không? – abesto

+0

Các nhận xét về sử dụng nội bộ hoặc người dùng thông thường không được áp dụng cho chính các chức năng đó, nhưng đối với các mô-đun. Các mô-đun bạn liên kết đều được xuất lại bởi các mô-đun khác (ví dụ: Yesod.Persist). Không có vấn đề với việc sử dụng các chức năng đó. Thật không may, tôi không có một ví dụ hoàn chỉnh, tuy nhiên. –

Các vấn đề liên quan