Ruby on rails 引用所有依赖对象集合

Ruby on rails 引用所有依赖对象集合,ruby-on-rails,activerecord,has-many-through,has-one,Ruby On Rails,Activerecord,Has Many Through,Has One,我有三个activerecord类:Klass、Reservation和Certificate Klass可以有多个预订,每个预订可能有一个证书 定义如下 class Klass < ActiveRecord::Base has_many :reservations, dependent: :destroy, :autosave => true has_many :certificates, through: :reservations attr_accessible

我有三个activerecord类:Klass、Reservation和Certificate Klass可以有多个预订,每个预订可能有一个证书

定义如下

class Klass < ActiveRecord::Base
  has_many :reservations, dependent: :destroy, :autosave => true  
  has_many :certificates, through: :reservations
  attr_accessible :name

  def kill_certs
    begin
      p "In Kill_certs"
      self.certificates.destroy_all
      p "After Destroy"
    rescue Exception => e
      p "In RESCUE!"
      p e.message
    end  
  end

end
我还尝试将预订类更改为“has_many:certificates”,然后错误是

"In RESCUE!"
"Cannot modify association 'Klass#certificates' because the source reflection
 class 'Certificate' is associated to 'Reservation' via :has_many."
奇怪的是,我可以从控制台中获取Klass.first.certificates和第一个类中的证书,但我无法在不产生错误的情况下执行Klass.first.certificates.delete\u。我是否遗漏了什么

这是唯一的办法

Klass.first.reservations.each do |res|
  res.certificate.destroy
end
感谢您的帮助。

RoR对此有明确的解释(对于TLDR,请阅读粗体):

从关联中删除

什么会被删除

这里有一个潜在的陷阱:你和你属于很多很多人吗 有很多:通过关联在联接表中有记录,以及 关联的记录。所以当我们调用其中一个删除方法时, 究竟应该删除什么

答案是假设关联上的删除是 关于删除所有者和关联用户之间的链接 对象,而不一定是关联对象本身。 因此,通过has_和_属于_many和has_many:通过,加入 记录将被删除,但关联的记录不会被删除

如果你仔细想想,这是有道理的:如果你打电话 post.tags.delete(Tag.find_by(name:'food'))您需要“food” 标记将与文章解除链接,而不是标记本身被取消链接 已从数据库中删除

然而,在一些例子中,这种策略是没有意义的。 例如,假设一个人有许多项目,每个项目都有 很多任务。如果我们删除一个人的任务,我们可能会 不希望删除项目。在此方案中,删除 方法实际上不起作用:仅当关联在 联接模型是您所属的。在其他情况下,您也可以使用它 直接对关联的记录或 :通过联想

与常规的has_许多没有区别 “关联记录”和“链接”,因此只有一种选择 什么会被删除

与has_和_属于_many和has_many:通过,如果你愿意的话 删除关联的记录本身,您总是可以做一些事情 按照person.tasks.each(&:destroy)的顺序执行

所以你可以这样做:

self.certificates.each(&:destroy)
RoR对此有明确的解释(TLDR仅以粗体显示):

从关联中删除

什么会被删除

这里有一个潜在的陷阱:你和你属于很多很多人吗 有很多:通过关联在联接表中有记录,以及 关联的记录。所以当我们调用其中一个删除方法时, 究竟应该删除什么

答案是假设关联上的删除是 关于删除所有者和关联用户之间的链接 对象,而不一定是关联对象本身。 因此,通过has_和_属于_many和has_many:通过,加入 记录将被删除,但关联的记录不会被删除

如果你仔细想想,这是有道理的:如果你打电话 post.tags.delete(Tag.find_by(name:'food'))您需要“food” 标记将与文章解除链接,而不是标记本身被取消链接 已从数据库中删除

然而,在一些例子中,这种策略是没有意义的。 例如,假设一个人有许多项目,每个项目都有 很多任务。如果我们删除一个人的任务,我们可能会 不希望删除项目。在此方案中,删除 方法实际上不起作用:仅当关联在 联接模型是您所属的。在其他情况下,您也可以使用它 直接对关联的记录或 :通过联想

与常规的has_许多没有区别 “关联记录”和“链接”,因此只有一种选择 什么会被删除

与has_和_属于_many和has_many:通过,如果你愿意的话 删除关联的记录本身,您总是可以做一些事情 按照person.tasks.each(&:destroy)的顺序执行

所以你可以这样做:

self.certificates.each(&:destroy)

如果在
kill\u certs
方法中调用
certificates.each(&:destroy)
而不是
destroy\u all
会发生什么?如果调用
certificates.each(&:destroy)会发生什么
而不是
在您的
kill\u certs
方法中销毁所有
?感谢您提供了非常完整的答案和文档链接!感谢您提供了非常完整的答案和文档链接!
Klass.first.reservations.each do |res|
  res.certificate.destroy
end
self.certificates.each(&:destroy)