2014-02-17 2 views
1

Rails 3: У меня есть отношение HABTM между моделью продукта и моделью ингредиентов. У меня есть множество сиротских ингредиентов, которые я хотел бы удалить из базы данных, поэтому мне нужно запросить эти ингредиенты, чтобы удалить их. Я предполагаю, что есть простой способ сделать это. Может ли кто-нибудь помочь мне здесь? Я ожидал, что это сработает, но Im получает ошибку неопределенных колонокHABTM потерянные записи - активный запрос записи?

Ingredient.joins(:products).where(products: []) 

ответ

1

here Look ->

В этом выглядит правильно:

Ingredient.joins('LEFT JOIN product_ingredients ON ingredients.id = product_ingredients.ingredient_id').where('product_ingredients.ingredient_id IS NULL').all 
1

products, скорее всего, не является столбцами либо из таблиц. Я думаю, что что-то подобное будет работать (при условии, что продукт имеет name, в противном случае заменить любой столбец, который на самом деле существует):

Ingredient.joins(:products).where("products.name IS NULL") 
+0

Это вызывает ошибку. Спасибо за ответ. – Brooks

0
Ingredient.all.map { | ingredient | ingredient.products.empty? } 

Это должно сопоставить все ингредиенты, которые имеют что пустое отношение. Вы также можете попробовать:

Ingredient.all.map { | ingredient | ingredient.products.count > 0 } 

Надеюсь, это поможет!

+0

Загрузка всего набора объектов ингредиентов происходит слишком медленно. Спасибо за ответ. – Brooks

0

нашел ответ here

Обратите внимание, что SQL-запрос делает LEFT JOIN на соединительной таблице, в данном случае 'product_ingredients'

Ingredient.joins('LEFT JOIN product_ingredients ON ingredients.id = product_ingredients.ingredient_id').where('product_ingredients.ingredient_id IS NULL').all 
Смежные вопросы