在Rails中批量删除has_many关联的行

时间:2011-04-20 23:37:21

标签: sql ruby-on-rails activerecord

我有一个模型Foo和一个模型Bar,两者都有has_many:bar_foos(然后是has_many彼此:through =>:bar_foos)。这是一个简单的很多:Foo和Bar之间的很多关系,通过BarsFoo模型。

我想删除bar_foos表中的几行。具体来说,我想删除任何bar_foo记录,该记录与给定的一组Foo和任何给定的Bars组相关。为了提高性能,我想发出一个数据库调用来执行此操作。

相应的SQL语句是:

DELETE FROM bar_foos WHERE bar_id IN ( ?, ?, ? ) AND foo_id in ( ?, ?, ? )

...同时用适当的ID替换?

如何使用Rails 2.3.x执行此操作?

理想情况下,我不会自己编写实际的SQL,而是编写ActiveRecord方法调用。但是,我怀疑这是否存在。

除此之外,我将自己制作SQL语句,但是:

  • 我想避免在SQL字符串
  • 中对表/列名进行硬编码
  • 我想使用某种自动(即:可靠)方法来转义SQL参数而不仅仅是连接字符串。

2 个答案:

答案 0 :(得分:4)

我认为使用关联你不可能自己编写(使用destroy_all

BarFoo.destroy_all(["bar_id IN (?) AND foo_id in (?)", bar_id_array, foo_id_array]) 

答案 1 :(得分:0)

你可以这样做......

has_many :bar_foos, :dependent => destroy

这会破坏属于刚被破坏的对象的所有bar_foos。