2017-07-24 164 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