2013-12-16 3 views
1

Итак, у меня есть модель House, и дом может have_manyRoom s.Rails Console - удалить все записи, которые не имеют ассоциации

Я хотел бы удалить все записи из House, которые не имеют Room s.

Я попытался

House.includes(:room).having('room.id IS NULL') 

, какие ошибки, как это делает

House.all().where(:room.count == 0) 

и многие другие вещи, которые я пробовал по той же схеме.

Возможно, у меня есть что-то очень прямолинейное, у кого есть идеи?

ответ

4

Ассоциация должна быть во множественном числе

House.includes(:rooms).where(rooms: { id: nil }).count 

И вы должны быть в состоянии удалить их с помощью

ids = House.includes(:rooms).where(rooms: { id: nil }).pluck(:id) 
House.where(id: ids).delete_all 

# Note: I'm leaving this as reference. It seems to raise an error. 
# House.includes(:rooms).where(rooms: { id: nil }).delete_all 

В противном случае вы можете работать с небольшим количеством чистого SQL и выполнить DELETE заявление непосредственно с помощью a join.

+0

Это правильное значение, но не выбрасывает такой столбец: rooms.id: error на delete_all. Похоже, он пытается найти room.id в Доме, хотя House> has_many rooms? – Advocation

+0

Не знаете, как 'delete_all' работает внутри. Вы всегда можете выполнять два отдельных запроса, я обновлю ответ. –

+0

Можете ли вы попытаться заменить 'includes (: rooms)' на 'joins (: rooms)'? –

Смежные вопросы