1

hashand_belongs_to_many로 연결된 두 모델의 사용자 및 회사가 있습니다. 내가 특정 회사에 속하지 않는 모든 사용자를 찾는레일/액티브 레코드 has_and_belongs_to_many association - 레코드를 가져 오는 중

Company.find(id).users 

내가 한 문제를 사용하여 특정 회사에 속한 모든 사용자를 가져올 수 있습니다. 글쎄, 할 수있어

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

그러나 나는 확실히 이것을 달성하는 좋은 방법이 있다고 느낀다. 거기에 activerecord 솔루션이 있습니까?

현재 8 명의 사용자가 있습니다 (1에서 8까지의 ID). 시도 할 때

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; 과거에 비슷한 일을했지만 위의 코드는 테스트되지 않았습니다.

또한이 패턴이 일반적인 쿼리 패턴 인 경우 MetaWhere 및 해당 MetaSearch에 제공된 ARel 확장을 사용하는 것이 좋습니다. N.B. 이것들은 Rails 3.1의 같은 저자에 의한 새로운 보석으로 대체되었습니다.

희망이 있습니다.

+0

답장을 보내 주셔서 감사 드리며 늦게 답변을 드려 죄송합니다. 그러나 이는 각 사용자에 대한 쿼리를 실행합니다. 즉, 필자의 경우 총 8 개의 쿼리가 발생합니다. 해고되는 쿼리의 수에 대해 걱정해야한다고 생각합니다. 해결 방법이 있습니까? – prasvin

+0

그래, 그 n + 1 쿼리 wtf 꽤 그 제안을 열심히 ... 편집, 새 버전을 시도 ... 더 효율적으로해야합니다. –

관련 문제