【问题标题】:How can I construct this complex ActiveRecord query?如何构造这个复杂的 ActiveRecord 查询?
【发布时间】:2011-10-18 10:59:48
【问题描述】:

我有一个总线模型和一个事件模型。每辆巴士都去参加一个活动:

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。不确定这是否有帮助?

【问题讨论】:

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


    【解决方案1】:

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

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

    因为 origin 已经与 bus 相关联并且您已经拥有 @event。

    【讨论】:

    • 我正在努力让一切都与 ActiveRecord 关系和范围一起工作。据我了解,如果一个事件有 6000 辆公共汽车前往它(请耐心等待),rails 会将它们全部加载到内存中并遍历它们中的每一个。 Afaik 那里有更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多