habtm关系不支持:依赖选项

Nic*_*ilt 24 ruby-on-rails has-and-belongs-to-many

HABTM关系不支持该:dependent选项是真的吗?

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试rails edge.

Mat*_*lly 77

如果你想保持简单的has_and_belongs_to_many关联,你可以添加:

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts
  before_destroy { posts.clear }
end
Run Code Online (Sandbox Code Playgroud)

这将清除所有条目的连接表person.注意:这只会从连接表中删除记录,它不会破坏posts(如果它是双向的,这是有意义的,has_and_belongs_to_many因为它post可能被其他人引用persons).

但是从你的名字(猜测PersonPost)我会假设你也许可以逃脱一Person has_many :postsPost belongs_to :person在这种情况下,你可以使用:dependent => :destroy上的has_many关联.

  • 我发现我不需要在rails 4.2.0(postgresql)中执行`before_destroy {posts.clear}`.Rails默认删除关系(它不删除相关记录,在此示例中为post). (17认同)
  • 我不确定语法是否原本就像这个答案,但我知道在rails 4中它应该是`before_destroy {posts.clear} (4认同)
  • 不错的小费信仰.has_and_belongs_to_many继续删除rails 5.0.0beta2中的关联 (3认同)

Jak*_*mpl 19

是的,它不支持它.查看文档.通常habtm只适用于非常非常简单的情况,如果你开始需要更复杂的东西,你应该切换到has_many :through.


moe*_*dol 5

尝试这个:

class Person < ActiveRecord::Base
  has_and_belongs_to_many :posts
  before_destroy do
    posts.each { |post| post.destroy }
  end
end
Run Code Online (Sandbox Code Playgroud)

您不需要 posts.clear 因为 Rails 4.2+ 已经处理了这个问题。

  • 这是正确的答案。一旦破坏 HABTM 关联,​​Rails 4.2+ 和 5+ 都会破坏关联表。 (3认同)