Ruby on rails Rails-销毁对象与条件的关联

Ruby on rails Rails-销毁对象与条件的关联,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个对象@foo,带有:与bar有许多关联,我想在foo销毁之前,如果bar具有属性type=test,则bar中的所有关联对象也将被销毁 以下代码正在工作,并且删除了foo对象,但条仍然存在: (如果我不使用条件。其中(键入:“test)所有条将被删除) 只需删除@foo.bar。每个{b | b.update_属性(:blub_id,nil)}并再试一次。我认为blub_id是一个外键,指示当前条属于哪个foo 当您使blub\u id等于null时,具有blub\u idnull的记录

我有一个对象
@foo
,带有:与
bar
有许多关联,我想在
foo
销毁之前,如果
bar
具有属性
type=test
,则
bar
中的所有关联对象也将被销毁

以下代码正在工作,并且删除了
foo
对象,但
条仍然存在:
(如果我不使用条件
。其中(键入:“test)
所有
条将被删除)


只需删除
@foo.bar。每个{b | b.update_属性(:blub_id,nil)}
并再试一次。我认为
blub_id
是一个外键,指示当前条属于哪个foo


当您使
blub\u id
等于null时,具有
blub\u id
null的记录不属于任何内容,然后
@foo.bar。其中(键入:“test”).destroy\u all
不包括这些条。

只需删除
@foo.bar.每个{b | b.update_属性(:b\u id,nil)}
然后再试一次。我想
blub\u id
是一个外键,指示当前条属于哪个foo


当您使
blub\u id
等于null时,具有
blub\u id
null的记录不属于任何内容,然后
@foo.bar。其中(键入:“test”).destroy_all
不包括这些条。

不知道这是一个整体规则还是仅针对控制器操作,但我认为最好在模型上这样做

不知道到底是什么线路

@foo.bars.each{|b| b.update_attribute(:blub_id, nil)}
是的,但如果blub_id是外键,则应在销毁带有测试类型的条后执行此操作。在您的foo模型上,可以按如下方式执行:

before_destroy :destroy_test_bars

def destroy_test_bars
   self.bars.where(type: "test").destroy_all
   self.bars.update_all(blub_id: nil)
end
然后,在你的控制器上

  def destroy
    @foo.destroy
    respond_to do |format|
      format.html { redirect_to foo_url, notice: 'Foo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

我想这是可行的。祝你好运!

我不知道这是一个整体规则,还是仅仅针对控制器操作,但我认为在模型上这样做会更好

不知道到底是什么线路

@foo.bars.each{|b| b.update_attribute(:blub_id, nil)}
是的,但如果blub_id是外键,则应在销毁带有测试类型的条后执行此操作。在您的foo模型上,可以按如下方式执行:

before_destroy :destroy_test_bars

def destroy_test_bars
   self.bars.where(type: "test").destroy_all
   self.bars.update_all(blub_id: nil)
end
然后,在你的控制器上

  def destroy
    @foo.destroy
    respond_to do |format|
      format.html { redirect_to foo_url, notice: 'Foo was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

我认为它可以工作。祝你好运!

一个好方法是在销毁回调后添加回调,在那里你可以编写任何你想要的逻辑

class Foo < ActiveRecord::Base
  has_many :bars
  after_destroy :cleanup

  private
  def cleanup
    if self.bars.where(type: "test")
      self.bars.destroy_all
    end
  end
end 
class Foo
一个好方法是添加“销毁后”回调,您可以在其中编写任何逻辑

class Foo < ActiveRecord::Base
  has_many :bars
  after_destroy :cleanup

  private
  def cleanup
    if self.bars.where(type: "test")
      self.bars.destroy_all
    end
  end
end 
class Foo