【问题标题】:Complex Search with Multiple Models and Geokit using Rails使用 Rails 使用多个模型和 Geokit 进行复杂搜索
【发布时间】:2011-06-15 01:10:47
【问题描述】:

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

我有一个包含 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 不支持它们。

有什么建议吗?

【问题讨论】:

  • 你必须使用 Geokit 吗?我创建了一个类似的搜索机制,用户可以在其中输入多个位置和半径,并在其边界相交处显示匹配项。出于性能原因,我在 SQL 中进行所有计算。如果您认为它们可能会有所帮助,我会稍后发布查询?
  • 我想我不必使用 geokit,但计算对我来说似乎有点复杂,更不用说将地址转换为 lat,lng 坐标

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


【解决方案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

【讨论】:

  • 谢谢。我几乎完全做到了这一点。主要数据模型是这样的原因是我想做一个活动搜索,而不是商业搜索。直到很久以后,我才深入了解 geokit 的复杂性,发现我可以通过另一个模型进行基于位置的搜索
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 2015-02-15
  • 2011-10-12
  • 2013-09-19
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多