我试图让搜索变得非常复杂(当然,为了让用户更容易)
我有一个包含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不支持它们。
有什么建议吗?
答案 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