2015-05-01 2 views
0

Я создаю приложение Rails, которое имеет модель пользователя, объединенную с моделью интересов через has_many: через отношения с использованием модели соединения UserInterests.Difficult Rails ActiveModel Query

Учитывая набор интересов, я хочу найти всех пользователей, которые выбрали хотя бы один интерес к этому набору, или кто не выбрал никаких интересов вообще. Я думаю о чем-то вроде этого:

users = users.joins(:user_interests).where(["COUNT(user_interests) = 0 OR user_interests.interest_id IN ?", interest_ids]) 

Это вызывает синтаксическую ошибку Mysql. Любые идеи, как достичь этого?

Большое спасибо

+1

Показать полную ошибку Mysql – rick

+0

Mysql :: Error: Invalid использование групповой функции: SELECT ' пользователей'. * FROM 'users' INNER JOIN 'user_interests' ON' user_interests'.'user_id' = 'users'.'id' WHERE (COUNT (user_interests) = 0 ИЛИ user_interests.interest_id IN (1)) – AdamP

ответ

0

попробовать это,

users = User.joins(:user_interests).where("COUNT(user_interests) = 0 OR interest_id IN (?)", interest_ids) 
+0

Такая же ошибка, я боюсь - я думаю, что проблема используется функция COUNT, а не синтаксис Rails. Мои знания SQL недостаточно хороши, к сожалению! – AdamP

+0

@AdamP Что у вас есть в user_interests? Что такое user_interests? column_name или array? – rick

+0

В Rails UserInterest - это модель, соединяющая пользователей и интересы, используя has_many: через отношения. Таблица базы данных user_interests имеет атрибуты user_id и interest_id. Поэтому я хочу найти пользователей, для которых есть запись user_interests с интересом в моем списке идентификаторов интересов, или пользователей, у которых нет связанных с ними user_interests. – AdamP

0
class User < ActiveRecord::Base 
    scope :with_interests, ->(*interests) { 
    joins(:user_interests).where(user_interests: {interest_id: interests.flatten.compact.uniq}) 
    } 

    scope :no_interests, -> { 
    where("not exists (select * from user_interests ui2 where ui2.user_id = users.id)") 
    } 
end 

interest = Interest.first 

User.with_interests(interest) + User.no_interests 
+0

Спасибо, но мне нужно использовать один запрос, поскольку я планирую связать его с другими условиями запроса – AdamP

0

Это работает для меня - хотя это не 100% идеальным.

  1. Добавить user_interests_count поле для пользователей с counter_cache
  2. Поиск с использованием LEFT JOIN запрос:

    пользователей = User.joins ("LEFT JOIN user_interests НА user_interests.user_id = users.id") .где ("? (users.user_interests_count =) ИЛИ user_interests.interest_id IN()?", 0, interest_ids)

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