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

Sql 使用Rails进行多模型和Geokit的复杂搜索,sql,ruby-on-rails,search,model,geolocation,Sql,Ruby On Rails,Search,Model,Geolocation,我试图使搜索变得非常复杂(当然,是为了让用户更容易) 我有一个应用程序有三种模式:活动、业务和地点 像这样: \\ 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 :

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

我有一个应用程序有三种模式:活动、业务和地点

像这样:

\\ 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,我是一个noob,所以我不确定如何让rails在一个模型(活动)中进行搜索,并在另一个模型(业务模型)中进行搜索以从位置模型中获取结果。geokit的参与使其更加复杂

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

我搞砸了一个多态模型“可寻址”,但我发现我几乎必须从其他模型的控制器开始

我也考虑过命名_范围,但我相信geokit不支持它们


有什么建议吗?

如果你认为你的模型过于复杂,这是一个需要重新设计的好迹象

有没有可能在没有业务的情况下开展活动?如果没有,那么如果业务已经有了可映射的位置,那么让活动作为可映射的(我假设您的活动数据库有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

如果你认为你的模型过于复杂,这是一个很好的迹象,它需要重新设计

有没有可能在没有业务的情况下开展活动?如果没有,那么如果业务已经有了可映射的位置,那么让活动作为可映射的(我假设您的活动数据库有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吗?我创建了一个类似的搜索机制,用户可以输入多个位置和半径,并在它们的边界相交处显示匹配项。出于性能原因,我使用SQL进行所有计算。如果你认为有帮助的话,我会稍后发布查询。我想我不必使用geokit,但计算对我来说似乎有点复杂,更不用说将地址转换为lat、lng坐标了。你必须使用geokit吗?我创建了一个类似的搜索机制,用户可以输入多个位置和半径,并在它们的边界相交处显示匹配项。出于性能原因,我使用SQL进行所有计算。如果你认为有帮助的话,我会稍后发布查询。我想我不必使用geokit,但计算对我来说似乎有点复杂,更不用说将地址转换为lat,lng CoordinateThanks了。我几乎完全实现了这一点。数据模型是这样的主要原因是我想做一个活动搜索,而不是商业搜索。直到很久以后,我才深入研究geokit的复杂性,并发现我可以通过另一个模型进行基于位置的搜索。我几乎完全实现了这一点。数据模型是这样的主要原因是我想做一个活动搜索,而不是商业搜索。直到很久以后,我才深入研究geokit的复杂性,发现我可以通过另一个模型进行基于位置的搜索