2014-11-23 24 views
0

我想用activerecord創建以下SQL。我的問題是,我卡在一個邏輯循環,我不能LEFT OUTER JOIN表尚未加入,我無法找到我的入口點加入失敗外部加入不是關聯的模型

in activerecord我正在嘗試

AdMsgs.joins("LEFT OUTER JOIN shows ON ad_msgs.user_id = shows.id OR ad_msgs.user_id = shows.b_id ") 
     .joins("LEFT OUTER JOIN m ON m.user_id = users.id OR m.m_id = shops.id OR m.m_id = shows.b_id") 
     .joins("LEFT OUTER JOIN users ON ad_msgs.to = users.email OR ad_msgs.user_id = users.id OR users.id = m.user_id") 
        .where("shows.id = ?", self.id) 
        .distinct("ad_msgs.id") 

查詢輸出錯誤說它不知道什麼用戶是在第二個連接(可能是因爲我還沒有加入它尚未),但我需要選擇根據用戶的m記錄

AdMsgs與這兩個表都沒有關聯。

有沒有辦法完全外連接這3個表,然後選擇那些相關的(或任何更好的辦法?)

+0

這將生成無效的SQL ...使用to_sql來查看此操作。 – PinnyM 2014-11-23 16:14:14

+0

請注意self.id,它可能會引發錯誤。這個查詢來自shows model – 2014-11-23 16:15:35

+0

對我來說,它看起來像一個數據庫設計問題。我唯一能想到的就是像通過INNER JOIN連接所有表並在WHERE子句中提供所有條件。 – mask8 2014-11-24 00:32:53

回答

0

使用find_by_sql來實現這些場景。

否則作爲一個經驗法則,如果你不能使用joins這樣的Blog.joins(articles: :comments)你可能會做一些壞事或使用find_by_sql來代替。

在一個複雜的情況下,我在SQL中首先編寫我的查詢來驗證涉及的邏輯。通常用一個簡單的查詢替換一個複雜的查詢是很簡單的(使用IN(*ids))。

+0

IN(* IDS)是否可以有很多ID?會導致懶惰加載它嗎? – 2014-12-08 12:52:00