Ruby on rails 引用所有依赖对象集合
我有三个activerecord类:Klass、Reservation和Certificate Klass可以有多个预订,每个预订可能有一个证书 定义如下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
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)