2017-07-24 161 views
0

我有兩個模型,故事和用戶。每個故事都屬於某個用戶。但是,調用用戶的.destroy方法並不會破壞它擁有的故事(當然,這會因爲外鍵約束而引發SQL錯誤),而是而不是。下面是從模型的相關代碼(與不相干的東西省略,很明顯):父對象被破壞時,相關對象不會被銷燬

class Story < ApplicationRecord 
    belongs_to :user, foreign_key: 'author', primary_key: 'name' 
end 
class User < ApplicationRecord 
    self.primary_key = :name 
    has_many :stories, foreign_key: 'author', primary_key: 'name' 
end 

這裏是從schema.rb表定義(同樣,省略無關列):

create_table "stories", force: :cascade do |t| 
    t.string "author", null: false 
    t.index["author"], name: "index_stories_on_author", using: :btree 
end 
create_table "users", id: false, force: :cascade do |t| 
    t.string "name", null: false 
    t.index ["name"], name: "index_users_on_name", unique: true, using: :btree 
end 
add_foreign_key "stories", "users", column: "author", primary_key: "name" 

事情我已經嘗試了做工作:

  • 刪除外鍵約束。 (這可以防止SQL錯誤,但不會從數據庫中刪除故事。)
  • 將「dependent::destroy」添加到belongs_to語句中。

可能相關但可能不相關的隨機事實:Story也擁有一些章節對象。我正在使用PostgreSQL。我有composite_primary_keys寶石。

回答

3

我相信你有一點倒退。 Story取決於User,所以dependent: :destroy指令在User這樣的事情屬於:

class User < ApplicationRecord 
    self.primary_key = :name 
    has_many :stories, foreign_key: 'author', primary_key: 'name', dependent: :destroy 
end 
+0

啊,謝謝! (這仍然導致SQL錯誤,但我可以通過刪除外鍵約束或使用:delete_all而不是:destroy來處理) – RFlaum

+0

更新:我想通過使用on_delete :: cascade可以防止SQL錯誤 – RFlaum