Как я могу построить этот сложный запрос ActiveRecord? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть модель автобуса и модель события.Каждый автобус идет на событие:

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 ассоциаций к Event и Origin.Не уверен, что это поможет?

1 Ответ

0 голосов
/ 18 октября 2011

Я думаю, что объединение бессмысленно!Почему вы не делаете это так?

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

Поскольку источник уже связан с шиной, и у вас уже есть @ event.

...