2015-05-20 103 views
0

我試圖選擇1)位於地圖座標中的所有通知,以及2)沒有清單(因此commentrelationships表中沒有active_comment_relationship)。評論也是類通知。 我不能獲得SQL完全正確:LEFT JOIN查詢的Rails SQL語法

nelat = params[:NElatitude] 
swlat = params[:SWlatitude] 
nelng = params[:NElongitude] 
swlng = params[:SWlongitude] 
find_by_sql(" SELECT  * 
       FROM  notices 
       WHERE  latitude < #{nelat} 
       AND  latitude > #{swlat} 
       AND  longitude < #{nelng} 
       AND  longitude > #{swlng} 
       LEFT JOIN commentrelationships 
       ON   notices.id = commentrelationships.commenter_id 
       WHERE  commentrelationships.commenter_id IS NULL 
       LIMIT 50 
      ; ") 

notice.rb:

has_one :active_comment_relationship, class_name: "Commentrelationship", 
             foreign_key: "commenter_id", 
             dependent: :destroy 
has_one :supernotice, through: :active_comment_relationship, source: :commentee 

我已經嘗試過這種方式圓的,但它會產生一些非常奇怪的錯誤,我懷疑是因爲它返回與給定座標的評論,不是注意:

find_by_sql(" SELECT  * 
       FROM  notices 
       LEFT JOIN commentrelationships 
       ON   notices.id = commentrelationships.commenter_id 
       WHERE  commentrelationships.commenter_id IS NULL 
       AND  latitude < #{nelat} 
       AND  latitude > #{swlat} 
       AND  longitude < #{nelng} 
       AND  longitude > #{swlng} 
       LIMIT 50 
      ; ") 

回答

0

這是您的查詢的粗略語法。如果你願意,你可以把它們放到命名的範圍中以使其更清晰。這並不完全清楚你的模型是什麼樣的,所以如果這不起作用,請將它們與你正在得到的確切錯誤消息一起添加到你的問題中。

Notices.joins("LEFT JOIN commentrelationships ON commentrelationships.commenter_id = notices.id") 
    .where(commenter_id: nil) 
    .where('latitude < ?', nelat) 
    .where('latitude > ?', swlat) 
    .where('latitude < ?', nelng) 
    .where('latitude > ?', swlng)