2011-08-22 38 views
0

它看起來像這樣:問題加入

nearbys(20, :units => :km).joins(:interests) 
    .where(["users.id NOT IN (?)", blocked_ids]) 
    .where("interests.language_id IN (?)", interests 
     .collect{|interest| interest.language_id}) 

這將產生以下SQL:

SELECT 
    *, 
    (111.19492664455873 * ABS(latitude - 47.4984056) * 0.7071067811865475) + 
     (96.29763124613503 * ABS(longitude - 19.0407578) * 0.7071067811865475) 
     AS distance, 
    CASE 
     WHEN (latitude >= 47.4984056 AND longitude >= 19.0407578) THEN 45.0 
     WHEN (latitude < 47.4984056 AND longitude >= 19.0407578) THEN 135.0 
     WHEN (latitude < 47.4984056 AND longitude < 19.0407578) THEN 225.0 
     WHEN (latitude >= 47.4984056 AND longitude < 19.0407578) THEN 315.0 
    END AS bearing 
FROM 
    "users" 
    INNER JOIN "interests" ON "interests"."user_id" = "users"."id" 
WHERE 
    (latitude BETWEEN 47.38664309234778 AND 47.610168107652214 
     AND longitude BETWEEN 18.875333386667762 AND 19.20618221333224 
     AND users.id != 3) 
    AND (users.id NOT IN (3)) 
    AND (interests.language_id IN (1,1))  
GROUP BY 
    users.id,users.name,users.created_at,users.updated_at,users.location, 
    users.details,users.hash_id,users.facebook_id,users.blocked,users.locale, 
    users.latitude,users.longitude 
ORDER BY 
    (111.19492664455873 * ABS(latitude - 47.4984056) * 0.7071067811865475) + 
    (96.29763124613503 * ABS(longitude - 19.0407578) * 0.7071067811865475) 

它返回的結果是正確的,但它取代了用戶的ID用的ID興趣。我在這裏錯過了什麼?

感謝您的幫助!

編輯:

我縮小了問題,下至地理編碼的寶石。

這工作完全:

User.where(["users.id NOT IN (?)", blocked_ids]).joins(:interests) 
    .where("interests.language_id IN (?)", interests 
     .collect{|interest| interest.language_id}) 

並返回:

[#<User id: 8, 
    name: "George Supertramp", 
    created_at: "2011-08-13 15:51:46", 
    updated_at: "2011-08-21 16:11:05", 
    location: "Budapest", 
    details: "{\"image\":\"http://graph.facebook.com/...", 
    hash_id: 1908133256, 
    facebook_id: nil, 
    blocked: nil, 
    locale: "de", 
    latitude: 47.4984056, 
    longitude: 19.0407578>] 

但是當我添加.near([緯度,經度],20,:單位=>:公里),它返回

[#<User id: 5, 
    name: "George Supertramp", 
    created_at: "2011-08-13 15:52:53", 
    updated_at: "2011-08-13 15:52:53", 
    location: "Budapest", 
    details: "{\"image\":\"http://graph.facebook.com/...", 
    hash_id: 1908133256, 
    facebook_id: nil, 
    blocked: nil, 
    locale: "de", 
    latitude: 47.4984056, 
    longitude: 19.0407578>] 

因爲如果以某種方式合併利息結果:

[#<Interest id: 5, 
    user_id: 8, 
    language_id: 1, 
    classification: 1, 
    created_at: "2011-08-13 15:52:53", 
    updated_at: "2011-08-13 15:52:53">] 

看來問題在於分組。我怎樣才能繞過它,而不是分化寶石。

回答

0

我已經通過使用include而不是join來解決問題了。這是一個愚蠢的解決方案,它可以在積極緩存的同時處理少量數據。

下面是代碼:

User.where(["users.id NOT IN (?)", blocked_ids]).includes(:interests).near([latitude, longitude], 20, :units => :km).select{|user| user if ([user.interests.find_by_classification(1).language_id, user.interests.find_by_classification(2).language_id] - [self.interests.find_by_classification(1).language_id, self.interests.find_by_classification(2).language_id]).size < 2 } 
+0

我一直在爲'獲取未定義的方法'near' – montrealmike

0

我想你加入表有一個ID字段這是造成問題。