簡體   English   中英

Rails ActiveRecord復雜連接問題 - 選擇不起作用

[英]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秒才能在我的桌面上運行! 但要了解它,這是我的抱怨:

  • 要嘗試提高性能,您可以看到我嘗試在ActiveRecord查找查詢中使用SELECT語句。 我只是想知道匹配的這些事件的標題,而不是所有其他字段。 但查詢通過,並從事件中選擇所有內容! 它使用我不熟悉的奇怪別名,如't1_r1'。 所以這顯然是個問題。

此外,這個查詢,當單獨對Venues運行時(即取消JOIN)在不到10ms的時間內執行。 那么有沒有辦法首先進行Venues搜索,然后對事件進行聯接? 我認為必須在整個兩個表上完成連接,然后只有地理編碼部分進入並縮小數據集。

任何幫助收緊這個問題的人都會非常感激(這是一個非商業項目)。 我覺得這個模型很簡單我應該能夠做到這一點而不用太大驚小怪?

提前致謝!

(編輯:在這篇文章的早期版本中,我是愚蠢的,限制工作正常,我的觀點被打破,編輯以取出那部分。)

看起來acts_as_mappable正在使用Rails Active Record的急切加載功能。 一旦你開始急切加載any :select參數被忽略,你不能從表/模型中指定特定的列。 在你的情況下,我認為這是因為:through=>:venue acts_as_mappable :through=>:venue acts_as_mappable:through=>:venue參數。 如果沒有通過論證,你能讓它發揮作用嗎? 您也可以隨時查看源代碼 ,看看是否還有其他調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM