Rails Найти через ассоциацию, местоположение

Например, у меня есть следующие модели:

class Location < ActiveRecord::Base
  attr_accessible :name, :full_address, :latitude, :longitude, :attr1 

  geocoded_by :full_address
  has_many :stores
  after_validation :geocode, :if => :full_address_changed?
end

и:

class Store < ActiveRecord::Base
  attr_accessible :attr2, :attr3
  belongs_to :location
end

Я хотел бы иметь возможность выполнять поиск по всем магазинам, которые:

  1. находятся поблизости (с использованием геокодера на модели местоположения)
  2. соответствует некоторым критериям attr1 в модели Location
  3. соответствует некоторым критериям attr2, attr3 в модели Store.

Как мне это сделать?


person k_day    schedule 10.01.2012    source источник
comment
Почему местоположение имеет отношение has_many к магазинам? Разве не должно быть наоборот? Например, Apple Store has_many места. Если это не торговый центр или что-то в этом роде, я предполагаю, что там будет только один магазин?   -  person Batkins    schedule 10.01.2012
comment
Извините, этот пример немного ввел в заблуждение. Пожалуйста, смотрите мое объяснение вашего ответа ниже.   -  person k_day    schedule 10.01.2012


Ответы (1)


Я все еще озадачен вашей установкой отношений... но скажем, у вас была установка, как я упоминал выше:

class Store < ActiveRecord::Base
  attr_accessible :attr2, :attr3
  has_many :locations
end

class Location < ActiveRecord::Base
  attr_accessible :name, :full_address, :latitude, :longitude, :attr1 

  geocoded_by :full_address
  belongs_to :store
  after_validation :geocode, :if => :full_address_changed?
end

Вы могли бы сделать что-то вроде этого...

locations = Location.near(current_location.to_s, 20).where(:attr1 => 'a value')
stores_that_match = locations.find_all {|loc| loc.try(:store).try(:attr2) == 'value2' && loc.try(:store).try(:attr3) == 'value3' }.map(&:store)

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

person Batkins    schedule 10.01.2012
comment
Извините, я понимаю, что мой пример был немного запутанным. Местоположение предназначено для представления чего-то вроде загородного гольф-клуба, в котором может быть или не быть более одного поля (магазин, в моем примере). В этом примере все поля в загородном клубе имеют несколько схожих свойств (местоположение, клубный рейтинг и т. д.), но имеют несколько собственных уникальных атрибутов. - person k_day; 10.01.2012
comment
Я могу в конечном итоге сделать что-то, как вы предлагаете, и просто дублировать сохранение широты/долготы в каждом магазине, даже если в одном месте может быть несколько магазинов. - person k_day; 10.01.2012