当父对象被销毁时,从属对象不会被销毁

时间:2017-07-24 20:56:21

标签: ruby-on-rails ruby

我有两个模型,故事和用户。每个故事属于某个用户。但是,调用User的.destroy方法会破坏它拥有的Stories(当然,由于外键约束,这会引发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语句。

可能相关但可能不相关的随机事实:故事还拥有一些章节对象。我正在使用PostgreSQL。我有composite_primary_keys gem。

1 个答案:

答案 0 :(得分: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