如何构建这个复杂的ActiveRecord查询?

时间:2011-10-18 10:59:49

标签: ruby-on-rails ruby-on-rails-3 activerecord geocoding arel

我有一个总线模型和一个事件模型。每辆公共汽车都要去参加一个活动:

class Bus < ActiveRecord::Base
  belongs_to :event
  belongs_to :origin
end

class Event < ActiveRecord::Base
  has_many :buses
end

如您所见,每辆公交车也有一个起点(它离开的地方)。原产地可以有许多公共汽车离开它。起源在创建时进行地理编码(由[Geocoder gem][1]),以便它们具有与之相关的纬度和经度。

class Origin < ActiveRecord::Base
  has_many :buses
  geocoded_by :full_address

  def full_address
    # returns the full address of the origin
  end
end

地理编码还为他们提供near范围,以便我可以搜索Origin.near([lat, long])

所以,我要做的就是找到前往@event并且其原点最接近[@lat, @long]的公交车。

这样的事情:

Bus.where(:event_id => @event.id)
   .joins(:origin)
   .near([@lat, @long])
   .first

但当然,由于Bus.where.joins会返回ActiveRecord::Relation,但near范围位于Origin类上,因此会出错。

undefined method `near' for #<ActiveRecord::Relation:0x000001053b36d8>

有什么想法吗?

修改
我突然意识到我可以将has_many :through个关联添加到EventOrigin。不确定这是否有帮助?

1 个答案:

答案 0 :(得分:-1)

我认为加入是毫无意义的!你为什么不这样做?

@event.buses.each do |bus|
      bus.origin.near([@lat, @long])
      _do sth,..._
end

Beacause origin已与总线相关联,您已经拥有@event。