使用geokit问题在Rails中进行基于位置的搜索

时间:2011-01-16 12:00:56

标签: ruby-on-rails search geolocation geokit

我的网站上有一个相当复杂(或看起来似乎)基于geokit的位置搜索。简而言之,我有一个名为“Campaigns”的模型属于另一个名为“Businesses”的模型。当我在网站上搜索时,用户正在搜索“广告系列”,但如果他们搜索该广告系列的商家名称,我希望所有相应的模型都显示在结果中。为此,我正在搜索中加入。

我还安装了geokit插件和gem,以便用户只能在距离原始位置(他们提供的)一定距离内获得这些搜索的结果。但是,当我将此位置功能添加到站点时,我得到了奇怪的结果。

如果我使用以下搜索(简化为简洁,但在控制台中测试):

Campaign.find(:all, 
              :joins => :business, 
              :conditions => ['businesses.name LIKE ?', "%Koo Koo Roo%"]
             )

我得到了合适的结果,即:

[#<Campaign id: 12, user_id: 4, business_id: 8, created_at: "2011-01-14 16:22:31", updated_at: "2011-01-14 16:25:20", lat: #<BigDecimal:2ad295a9eda8,'0.34154891E2',18(18)>, lng: #<BigDecimal:2ad295a9ed08,'-0.118358834E3',18(18)>>]

但是,如果我尝试将基于geokit的位置搜索参数添加到此搜索中,如下所示:

Campaign.find(:all, 
              :joins => :business, 
              :origin => "90066", 
              :within => 25, 
              :conditions => ['businesses.name LIKE ?', "%Koo Koo Roo%"]
             )

我得到以下结果:

[#<Campaign id: 8, user_id: 4, business_id: 8, created_at: "2011-01-14 16:25:20", updated_at: "2011-01-14 16:25:20", lat: #<BigDecimal:2ad29933e618,'0.34154891E2',18(18)>, lng: #<BigDecimal:2ad29933e578,'-0.118358834E3',18(18)>>]

几乎完全相同。唯一的区别是,对于第二个结果,它似乎将business_id作为Campaign id传递。我已经对此进行了两次验证,两次都是相同的,广告系列ID会被business_id替换。

我应该提一下,无论如何都是如此:在我进入的距离内。

我在这里做错了什么?我错过了什么吗?我似乎无法弄明白,这一切对我来说都很合理,但显然不是!我不明白geokit会如何搞砸这样的结果。

在我的模特中我只是:

Business.rb
has_many :campaigns

Campaign.rb
belongs_to :business

任何帮助将不胜感激。我错过了某种关联吗?我没有启用geokit缓存。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为“id”字段被狡猾的连接代码覆盖。当你加入时,你有两个“id”字段(一个用于商业,一个用于活动)。没有关于哪个是“id”的明确指示,DB猜测。

不幸的是,其中一个版本的rails有一个错误,它没有明确声明主Active Record id(在本例中为Campaign.id)是重要的id ...并且db猜错了一,用Business.id覆盖id。

你已经发现了一个简单的(但更多的是hacky)修复程序......另一个是升级rails。