2015-05-20 2 views
0

Я пытаюсь выбрать все уведомления, которые 1) лежат в координатах карты, и 2) не имеют суперновости (и, следовательно, нет active_comment_relationship в таблице комментариев). Комментарии также относятся к классу. я не могу получить SQL совершенно правильно:Rails SQL-синтаксис для запроса LEFT JOIN

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)