![](/img/trans.png)
[英]Rails: complex search on 3 models, return only newest - how to do this?
[英]Complex Search with Multiple Models and Geokit using Rails
我正在尝试使搜索变得非常复杂(当然,这会使用户更轻松)
我有一个具有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,我是一个菜鸟,所以我不确定如何在一个模型(广告系列)中搜索rails,并在另一个模型(业务模型)中进行搜索以从Location模型中获取结果。 涉及geokit的事实使其更加复杂。
我试过了:campaign.rb中的acts_as_mappable :through => :locations
,但是它只是抛出了一个SQL错误
我把“可寻址”的多态模型弄乱了,但是我发现我几乎必须从其他模型的控制器开始。
我也考虑过named_scopes,但我相信geokit不支持它们。
有什么建议么?
如果您认为模型过于复杂,则表明它需要重新设计。
可以开展没有生意的竞选活动吗? 如果不是,那么如果业务已经具有可映射的位置,则使活动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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.