2011-07-26 108 views
0

我有以下查詢嵌套的SQL查詢

@initial_matches = Listing.find_by_sql(["SELECT * FROM listings WHERE industry = ?", current_user.industry]) 

有沒有一種方法,我可以運行在選擇從上面的查詢使用各做一套SQL查詢?我想運行geokit計算來消除特定距離之外的某些列表...

回答

0

您的問題有點混淆。你想使用each..do(ruby)來進行過濾。或者你想使用一個SQL查詢。這裏是你如何讓Ruby進程做過濾

refined list = @initial_matches.map { |listing| 
    listing.out_of_bounds? ? nil : listing 
}.comact 

如果你想使用SQL,你可以簡單地添加額外的SQL(可能是子選擇)到您的通話Listing.find_by_sql

如果您想按照您在評論中所說的去做。

WHERE location1.distance_from(LOCATION2,:單位=>:英里)

你混合紅寶石(location1.distance_from(location2, :units=>:miles))和SQL(WHERE X > 50)。這很困難,但並非不可能。

但是,如果您必須在ruby中進行距離計算,那麼爲什麼不在那裏進行過濾。所以本着第一個例子的精神。

listing2 = some_location_to_filter_by 
@refined_list = @initial_matches.map { |listing| 
    listing.distance_from(listing2) > 50 ? nil : listing 
}.compact 

這將遍歷所有列表,只保留那些比預定列表更遠的列表。

編輯:如果此邏輯在控制器中完成,則需要將其分配給@refined_list而不是refined_list,因爲視圖只能訪問控制器實例變量(與本地相對)。

+0

我的問題是,我需要這樣做:'where where location1.distance_from(location2,:units =>:miles)<50',我顯然不能在SQL中這樣做,因爲distance_from是一個紅寶石函數 – Lisa

+0

Ha對不起 - 意外進入。 – Lisa

+0

看我的編輯。然而更具體一些,仍然會有很長的路要走。什麼是location1和location2參考您的原始文章? – diedthreetimes

0

總之,沒有。這是因爲在初始查詢之後,您不會留下關係表或視圖,而是留下一組activerecord對象。因此,在初始查詢之後要完成的任何處理都必須採用ruby和activerecord格式,而不是sql。