Массовое удаление has_many связанных строк в Rails - PullRequest
1 голос
/ 21 апреля 2011

У меня есть модель Foo и модель Bar, оба из которых has_many: bar_foos (а затем has_many друг друга: through =>: bar_foos). Это просто много-много-много отношений между Foo и Bar через модель BarsFoo.

Я хочу удалить несколько строк в таблице bar_foos. В частности, я хочу удалить любую запись bar_foo, которая относится к любому из данного набора Foos и к любому из данного набора Bars. Для повышения производительности я бы хотел сделать один вызов базы данных, чтобы сделать это.

Соответствующий оператор SQL будет:

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

... при замене ? на соответствующие идентификаторы.

Как мне это сделать с помощью Rails 2.3.x?

В идеале, я бы не писал сам SQL, а выполнял бы вызовы методов ActiveRecord. Однако я сомневаюсь, что это существует.

За исключением этого, я сам напишу оператор SQL, но:

  • Я бы хотел избежать жесткого кодирования имен таблиц / столбцов в строке SQL
  • Я бы хотел использовать какой-то автоматический (то есть надежный) метод для экранирования параметров SQL вместо простого объединения строк.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

Я думаю, что это невозможно, используя ассоциацию, вы должны написать ее самостоятельно (используйте destroy_all )

BarFoo.destroy_all(["bar_id IN (?) AND foo_id in (?)", bar_id_array, foo_id_array]) 
0 голосов
/ 21 апреля 2011

Вы можете сделать это ...

has_many :bar_foos, :dependent => destroy

И это уничтожит все bar_foos, которые принадлежат объекту, который был только что разрушен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...