1

我有一个项目,用户可以在其位置的指定距离内搜索结果,例如在其邮政编码的 10 英里内。我为此使用了geokit-rails,并且使用简单的方法效果很好:

.within(@distance, :origin => @latlng)

但是,有些结果不依赖于位置,因此我希望它们始终出现在搜索中,这将由一个名为“remote”的位属性表示,如果应该包含它,则设置为 1。

所以我需要做的是能够搜索距离小于 X 或远程等于 1 的所有结果。

有什么办法可以做到这一点,还是我必须进行 2 次数据库调用并合并结果?

非常感谢

4

1 回答 1

0

距离属性已从库中删除,但有一些关于如何再次包含的解决方法,已经包含可以使用远程属性为您的属性距离添加条件。

module Geokit::ActsAsMappable
  module ClassMethods
    # Overwrite Geokit `within`
    def within(distance, options = {})
      options[:within] = distance

      # Have to copy the options because `build_distance_sql` will delete them.
      conditions = distance_conditions(options.dup)
      sql = build_distance_sql(options)
      self.select(
        "#{sql} AS #{self.distance_column_name}, #{table_name}.*"
      ).where(conditions)
    end

    # Overwrite Geokit `by_distance`
    def by_distance(options = {})
      sql = build_distance_sql(options)
      self.select("#{sql} AS #{self.distance_column_name}, #{table_name}.*"
      ).order("#{self.distance_column_name} ASC")
    end

    private

    # Copied from geokit-rails/lib/geokit-rails/acts_as_mappable.rb
    # Extract distance_sql building to method `build_distance_sql`.
    def build_distance_sql(options)
      origin  = extract_origin_from_options(options)
      units   = extract_units_from_options(options)
      formula = extract_formula_from_options(options)

      distance_sql(origin, units, formula)
    end
  end
end

https://github.com/geokit/geokit-rails/issues/56

于 2015-04-22T22:03:26.530 回答