使用Rails进行多模型和Geokit的复杂搜索

时间:2011-01-25 08:34:59

标签: sql ruby-on-rails search model geolocation

我试图让搜索变得非常复杂(当然,为了让用户更容易)

我有一个包含3个模型的应用:广告系列,商家和地点

像这样:

\\ campaign.rb
  belongs_to :business
  has_many :locations, :through => :business
  acts_as_mappable

\\ business.rb
  has_many :campaigns
  has_many :locations

\\ location.rb
  belongs_to :business
  has_many :campaigns, :through => :business
  acts_as_mappable

设置方式,有些企业有多个地点。对于那些没有的人,geokit信息被编码到活动数据库条目中。对于那些有多个位置的人,geokit信息被编码到位置数据库条目中。

我正在尝试搜索会在一定距离内返回结果的广告系列。在处理具有单一地址的企业时,这很简单。

  Campaign.find(:all,  
       :conditions => [blahblahblah],
       :origin => address,
       :within => distance
       )

但是,我还希望包含属于具有多个位置的商家的广告系列。我希望搜索返回该广告系列的结果,如果该商家有多个位置,并且这些位置中的任何一个位于该范围内。我想的是:

  Campaign.find(:all, 
       :include => [:business, :locations]
       :conditions => [blahblahblah],
       :origin => address,
       :within => distance
       )

但是,对于属于具有多个位置的商家的广告系列,这不会返回任何结果。在谈到SQL时我是一个菜鸟,所以我不确定如何在一个模型(Campaign)中进行rails搜索,并在另一个模型(Business模型)中搜索以从Location模型中获取结果。涉及geokit这一事实使其更加复杂。

我在campaign.rb中尝试了acts_as_mappable :through => :locations,但它只是抛出了一个sql错误

我弄乱了一个“可寻址”的多态模型,但我发现我几乎要从其他模型的控制器开始。

我也考虑过named_scopes,但我相信geokit不支持它们。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您认为您的模型过于复杂,则表明需要重新设计。

是否有可能没有业务的广告系列?如果没有,那么如果业务已经有可映射的位置,那么制作广告系列act_as_mappable(我假设你的广告系列数据库有lat和lng列)是没有意义的。

如果广告系列与具有多个位置的商家相关联,那么广告系列的位置是什么?你在campaigns.lat和lng属性中存储了什么?

如果您坚持使用数据模型,我建议您将搜索分解为多个命令:

def find_campaigns_near(origin,distance)
    locations = Location.find(:all,  
            :origin => address,
            :within => distance
    );
    # use Hash for uniqueness based on id
    campaigns = Hash.new
    locations.each do |location|
        location.campaigns.each do |campaign|
            campaigns[campaign.id] = campaign if campaigns[campaign.id].blank?
        end
    end
    campaigns
end