1

У меня есть две модели пользователя и компании, связанные с has_and_belongs_to_many. я могу извлечь все пользователи, принадлежащие к определенной компании, используяRails/Active Record has_and_belongs_to_many объединение - получение записи

Company.find(id).users 

Проблема Я находит всех пользователей, которые не принадлежат к определенной компании. Ну, я мог бы это сделать, используя

User.all - Company.find(id).users 

Но, я чувствую, что есть, конечно, лучший способ достичь этого. Есть ли решение activerecord для этого?

В настоящее время у меня есть 8 пользователей (от 1 до 8). Когда я пытаюсь,

User.joins(:companies).where('companies.id = ?', 13).map(&:id) 

Я получаю результат [7, 8], который как и ожидалось. Когда я размещаю! = В приведенном выше запросе, результаты не то, что я хочу, то есть массив от 1 до 6.

Нужна помощь. Спасибо.

ответ

2

Самый простой способ может быть с помощью метода класса ... что-то вроде:

class User 

    has_and_belongs_to_many :companies 

    class << self 

    def exclude_company(company) 
     User.scoped.reject! {|u| u.companies.include? company} 
    end 
    end 
end 

Затем в коде:

@company = Company.find(company_id) 
@users = User.exclude_company(@company) 

YMMV; В прошлом я делал подобные вещи, но приведенный выше код не тестировался.

Кроме того, если это общий шаблон запроса, вам, вероятно, будет лучше обслуживаться расширениями ARel, предоставленными в MetaWhere и его спутником MetaSearch. Нотабене Они заменены новыми драгоценными камнями того же автора в Rails 3.1.

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

+0

Спасибо за быстрый ответ и жаль позднего ответа. Но это вызывает запрос для каждого пользователя, то есть в моем случае всего 8 запросов. Думаю, я должен беспокоиться о количестве запущенных запросов. Есть ли обходной путь? – prasvin

+0

Да, я ударил, что n + 1 запросов wtf довольно сложно с этим предложением ... Я редактировал, попробовал новую версию ... должен быть более эффективным. –

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