2013-07-18 60 views
0

實現這個我直接使用此查詢,並希望使用ActiveRecord,如何在ActiveRecord的

SELECT count(*) 
    FROM p 
     LEFT JOIN 
      (SELECT pid 
      FROM s LEFT JOIN i ON s.key = i.sid 
      WHERE i.default = 'y') AS table_x 
     ON p.pid = table_x.pid WHERE isnull(table_x.pid) AND p.show = 'y' 

但我不太清楚如何實現以上。我目前的定義如下。

class P < ActiveRecord::Base 
    has_many :s, :foreign_key => 'pid' 
    has_many :i, :through => :s 
end 


class S < ActiveRecord::Base 
    belongs_to :p, :foreign_key => 'pid' 
    has_many :i, :foreign_key => 'sid' 
end 

class I < ActiveRecord::Base 
    belongs_to :s, :foreign_key => 'sid' 
    belongs_to :p, :through => :s 
end 

我很想知道的部分是關於如何創建/將子查詢作爲表格/模型?

+1

pid定義表s或我嗎? –

回答

1

這裏的一個問題是,您試圖根據要求爲空的列(pid)在表上執行聯接。您不能加入NULL值。但是,如果這是一個錯誤,你就想加入對NULL pid值,那麼相應的SQL語句將如下(假設s表包含pid,不i):

SELECT count(*) FROM p 
LEFT JOIN s ON s.pid=p.pid 
LEFT JOIN i ON s.key=i.sid 
WHERE i.default='y' AND p.show = 'y' 

這個查詢很容易轉換爲ActiveRecord,因爲您可以簡單地使用.joins()方法連接在一起,方法是.where()。也許像這樣的東西可以爲你工作:

P.joins(:s => :i).where('i.default = ?', 'y').where('p.show = ?', 'y').count()