[英]Rails ActiveRecord Problem With Complex Join - Select Does Not Work
我有兩個模型對象:
活動有場地。 場地可以舉辦1 ... *活動。
場地有一個位置,一個緯度和長度,我使用Geokit Rails插件。 以下是這些模型在Rails中的樣子:
class Event < ActiveRecord::Base
belongs_to :venue
acts_as_mappable :through => :venue
end
和
class Venue < ActiveRecord::Base
has_many :events
acts_as_mappable
end
非常簡單! 現在,我想運行一個查詢,我想在某個區域的幾英里范圍內找到所有事件,查看Geokit API,我看到我可以使用mappable:通過關聯事件,並且應該能夠在Event上調用geokit finders! 很好(所以你可以看到上面,我添加了acts_as_mappable:直到事件)。
這是我的ActiveRecord查詢:
Event.find(:all, :origin => [lat, lng], :select => 'title', :within => 5, :limit => 10)
這是生成的SQL:
SELECT `events`.`id` AS t0_r0, `events`.`title` AS t0_r1, `events`.`description` AS t0_r2,
`events`.`created_at` AS t0_r3, `events`.`updated_at` AS t0_r4, `events`.`venue_id` AS
t0_r5, `events`.`event_detail_id` AS t0_r6, `events`.`event_detail_type` AS t0_r7,
`venues`.`id` AS t1_r0, `venues`.`name` AS t1_r1, `venues`.`lat` AS t1_r2, `venues`.`lng`
AS t1_r3, `venues`.`created_at` AS t1_r4, `venues`.`updated_at` AS t1_r5 FROM `events` LEFT
OUTER JOIN `venues` ON `venues`.id = `events`.venue_id WHERE
(((venues.lat>51.4634898826039 AND venues.lat>51.5533406301823 AND venues.lng>-
0.197713629915149 AND venues.lng<-0.053351862714855)) AND
((ACOS(least(1,COS(0.898991438708539)*COS(-0.00219095974226756)*COS(RADIANS(venues.lat))*COS(RADIANS(venues.lng))
COS(0.898991438708539)*SIN(-
0.00219095974226756)*COS(RADIANS(venues.lat))*SIN(RADIANS(venues.lng))
SIN(0.898991438708539)*SIN(RADIANS(venues.lat))))*6376.77271)
<= 5)) LIMIT 10
哎喲。 好吧,這需要相當長的時間才能運行,而且不僅僅是數學,我認為這里有一個重要的性能問題,這需要2秒才能在我的桌面上運行! 但要了解它,這是我的抱怨:
此外,這個查詢,當單獨對Venues運行時(即取消JOIN)在不到10ms的時間內執行。 那么有沒有辦法首先進行Venues搜索,然后對事件進行聯接? 我認為必須在整個兩個表上完成連接,然后只有地理編碼部分進入並縮小數據集。
任何幫助收緊這個問題的人都會非常感激(這是一個非商業項目)。 我覺得這個模型很簡單我應該能夠做到這一點而不用太大驚小怪?
提前致謝!
(編輯:在這篇文章的早期版本中,我是愚蠢的,限制工作正常,我的觀點被打破,編輯以取出那部分。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.