Rails / Active Record имеет ассоциацию has_and_belongs_to_many - извлечение записи - PullRequest
2 голосов
/ 06 января 2012

У меня есть две модели: Пользователь и Компания, связанные с 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.

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

1 Ответ

2 голосов
/ 06 января 2012

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

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

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

...