如何在ActiveRecord中删除具有相关记录的多个记录

时间:2012-02-09 05:57:00

标签: ruby-on-rails activerecord

create table foo (id, name, order, ...);
create table foo_bar (id, foo_id, name, value);

foo包含订单栏,其值为(1,2,3,4,5,... 10) 假设foo_bar包含每个foo的多个记录。

如何删除订单值为3..6的foos及其相关记录?

2 个答案:

答案 0 :(得分:13)

class Foo < ActiveRecord::Base
  has_many :foo_bars,  :dependent => :destroy
end

class FooBar < ActiveRecord::Base
  belongs_to  :foo
end

如果您的关系如上所述,则以下代码将起作用

Foo.delete_all(["id in (?)", [3,4,5,6]])

或者只是

Foo.delete([3,4,5,6])

参考delete

EDITED

从小知道我知道你的问题我觉得你有类似的事情

foo table

id  some_column    order
1   some_value      3
2   some_value      4
3   some_value      3
4   some_value      2
5   some_value      1
6   some_value      5
7   some_value      6

foo_bar table

id  some_column    foo_id
1   some_value      2
2   some_value      1
3   some_value      3
4   some_value      2
5   some_value      4
6   some_value      5
7   some_value      6

然后用户关注order而不是id

Foo.delete_all(["order in (?)", [3,4,5,6]])

答案 1 :(得分:1)

正确答案,销毁(删除)dependens:

正如@Salil所说,如果你的模型有这样的dependent callback

has_many :foo_bars,  :dependent => :destroy

您要销毁父记录和从属记录的查询应为:

Foo.where(order: [1, 2, 3, 4]).destroy_all

方法where将获取包含orders数组的所有记录,并为找到的每条记录调用destroy方法。

如果您不想执行有关销毁依赖关系的回调,则必须使用deletedelete_all