1

has_and_belongs_to_manyで関連付けられた2つのモデルのユーザーと会社があります。 私は特定の会社に属していないすべてのユーザーを見つけることですRails/Active Record has_and_belongs_to_many association - レコードを取得する

Company.find(id).users 

私がきた問題を使用して特定の企業に属するすべてのユーザーを取得することができます。まあ、私は

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

を使用してしかし、私はこれを達成するためのより良い方法は確かにあります感じていることを行うことができます。これにはactiverecordの解決策がありますか?

現在、8人のユーザーがいます(1〜8のID)。試してみると、期待通りの結果[7、8]が出ます。

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

上記のクエリに=を配置すると、結果は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クエリーをヒットしました...私は編集しました、新しいバージョンを試してください...より効率的です。 –