2012-01-05 17 views
5

私は、HABTM関連を有する2つのモデルを持っています。habtm関連のarelテーブルを取得するには?

Arelを使用して孤児レコードを取得するには、scopeと書いておきたいと思います。

私の問題は、関連のarel_tableを取得する方法が見つかりませんでした。関係はHABTMなので、arel_tableと呼ぶモデルはありません。

私は次のようになりました(動作します)が、私は新しいテーブルを作成します(reflect_on_associationメソッドを使用して取得した結合テーブルの名前)。

scope :orphans, lambda { 
    teachers = arel_table 
    join_table = Arel::Table.new(reflect_on_association(:groups).options[:join_table]) 

    join_table_condition = join_table.project(join_table[:teacher_id]) 
    where(teachers[:id].not_in(join_table_condition)) 
} 

これは、次のSQLを生成します:

SELECT `teachers`.* 
FROM `teachers`  
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id` 
           FROM `groups_teachers`)) 

は、だからではなく、新しいものを作るのarel_tableを取得するための任意のより良い方法はありますか?

+0

メモ、これを行うには、よりクリーンな方法があると思う、以下の私の答えを参照してください。 – Andrew

答えて

3

は残念ながら、私はあなたのソリューションが今あるとインスタンス化のときに連想自体が内部的に何をするか、実際には、ある、かなりクリーンであると考えている:

https://github.com/rails/rails/blob/46492949b8c09f99db78b9f7a02d039e7bc6a702/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb#L7

私はreflection.join_table彼らと信じてvs reflection.options [:join_table]を使用するのは今のところマスターのみです。

2

あなたは協会の名前を知っているので、この場合には、それはあなたが行うように、あなたが呼び出すことができるはず見えるテーブル、参加する場合:ARELテーブルのを返す私のテストで

Arel::Table.new(:groups_teachers) 

をhabtm連合。これを私に指摘してくれたthis answerに感謝します。

+0

少なくとも今は(ARel 3.0.2とAR 3.2を見て)、 'Groups.reflect_on_association(:teachers).through_reflection.klass.arel_table'のような醜い陸上競技をすることができます。 – Nicos

+0

誰かが混乱している場合の簡単な例! (:sports_users)[:sport_id] .eq(SPORT_ID)) '':User.joins(:sports).where(Arel :: Table.new(:sports_users)[:sport_id] .eq – Marrs

関連する問題