2012-01-05 16 views
5

HABTM ilişkilendirmesi olan iki ActiveRecord modelim var.Bir habtm derneği arel tablosu nasıl alınır?

Arel kullanarak yetim kayıtlarını almak için scope yazmak istiyorum.

Sorunum, ilişkinin arel_table sürümünü almak için bir yöntem bulamadığım. İlişki HABTM olduğundan, arel_table numaralı telefonu aramak için model yoktur.

Şu an (şimdi çalışır) var, ancak birleştirme tablosunun adıyla (reflect_on_association yöntemini kullanarak alınan) yeni bir yayın tablosu oluşturuyorum.

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

Yani arel_table almak yerine yenisini yapmak için daha iyi bir yol yoktur:

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)) 
} 

Bu aşağıdaki SQL üretir? Maalesef

+0

Not: Bunu yapmanın daha temiz bir yolu olduğunu düşünüyorum, cevabımı aşağıya bakın. – Andrew

cevap

2

Eğer dernek adını biliyor ve bu nedenle bu durumda senin gibi, aramak gerekir görünüyor tablo, katılırsanız: Arel tabloyu ait döner Benim test

Arel::Table.new(:groups_teachers) 

bir habtm derneği. Bunu bana bildirmek için this answer'a teşekkürler.

+0

En azından şimdilik (ARel 3.0.2 ve AR 3.2'ye bakarak), düzgün bir şekilde bağlı bir nesne vermesi gereken Groups.reflect_on_association (: teacher) .through_reflection.klass.arel_table' gibi çirkin atletizm yapabilirsiniz. – Nicos

+0

Çabuk birisi varsa şaşkın! 'User.joins (: spor) .where (Arel :: Table.new (: sports_users) [: sport_id] .eq (SPORT_ID))' – Marrs

İlgili konular