Сложный поиск с несколькими моделями и Geokit с использованием Rails - PullRequest
1 голос
/ 25 января 2011

Я пытаюсь сделать поиск очень сложным (конечно, чтобы было проще для пользователей)

У меня есть приложение с 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

Как это настроено, есть некоторые предприятия, которые имеют несколько мест.Для тех, кто этого не делает, информация о геоките кодируется в запись базы данных кампании.Для тех, у кого есть несколько местоположений, информация о геоките закодирована в записи базы данных местоположений.

Я пытаюсь выполнить поиск кампаний, которые вернут результаты на определенном расстоянии.Это достаточно просто при работе с компаниями, имеющими один адрес.

  Campaign.find(:all,  
       :conditions => [blahblahblah],
       :origin => address,
       :within => distance
       )

Однако я хочу также включить кампании, которые принадлежат предприятиям, имеющим несколько местоположений.Я хочу, чтобы поиск возвращал результат для этой кампании, если у компании несколько местоположений, и если какое-либо из этих местоположений попадает в границы.Я думал что-то вроде:

  Campaign.find(:all, 
       :include => [:business, :locations]
       :conditions => [blahblahblah],
       :origin => address,
       :within => distance
       )

Но это не возвращает никаких результатов для кампаний, которые принадлежат предприятиям, имеющим несколько местоположений.Я новичок, когда дело доходит до SQL, поэтому я не совсем уверен, как выполнить поиск по рельсам в одной модели (Campaign) и поиск по другой модели (бизнес-модели), чтобы получить результаты из модели Location.Тот факт, что геокит задействован, делает его еще более сложным.

Я пробовал: acts_as_mappable :through => :locations в campaign.rb, но он просто выдал ошибку sql

Я испортил полиморфную модель "адресуемый ", но я обнаружил, что мне придется начать с контроллеров других моделей с нуля.

Я также думал о named_scopes, но я считаю, что geokit их не поддерживает.

Есть предложения?

1 Ответ

1 голос
/ 28 января 2011

Если вы думаете, что ваша модель слишком сложна, это хороший знак того, что она нуждается в редизайне.

Возможно ли провести кампанию без бизнеса?если нет, то не имеет смысла делать кампанию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...