Rails通过协会查找,位置

时间:2012-01-10 04:11:39

标签: ruby-on-rails rails-geocoder

例如,我有以下模型:

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. 在附近(使用位置模型上的Geocoder)
  2. 符合位置模型中attr1的一些条件
  3. 符合商店模型中attr2,attr3的一些标准。
  4. 我应该怎么做?

1 个答案:

答案 0 :(得分: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)

话虽这么说,最后一部分将在上面提供的代码中使用ruby缩小。如果你想缩小相关模型的标准,因为你只是在谈论使用查询,你可能会去必须使用ActiveRecord's find_by_sql method并手动编写查询。