Commit 6c54d1c330e4c40e70a393524d1dce5e74b6047a
1 parent
bacb490a
Exists in
api_tasks
and in
1 other branch
Filter profile by location
Showing
1 changed file
with
42 additions
and
0 deletions
Show diff stats
app/models/profile.rb
| ... | ... | @@ -100,6 +100,48 @@ class Profile < ActiveRecord::Base |
| 100 | 100 | } |
| 101 | 101 | scope :no_templates, {:conditions => {:is_template => false}} |
| 102 | 102 | |
| 103 | + # Returns a scoped object to select profiles in a given location or in a radius | |
| 104 | + # distance from the given location center. | |
| 105 | + # The parameter can be the `request.params` with the keys: | |
| 106 | + # * `country`: Country code string. | |
| 107 | + # * `state`: Second-level administrative country subdivisions. | |
| 108 | + # * `city`: City full name for center definition, or as set by users. | |
| 109 | + # * `lat`: The latitude to define the center of georef search. | |
| 110 | + # * `lng`: The longitude to define the center of georef search. | |
| 111 | + # * `distance`: Define the search radius in kilometers. | |
| 112 | + # NOTE: This method may return an exception object, to inform filter error. | |
| 113 | + # When chaining scopes, is hardly recommended you to add this as the last one, | |
| 114 | + # if you can't be sure about the provided parameters. | |
| 115 | + def self.by_location(params) | |
| 116 | + params = params.with_indifferent_access | |
| 117 | + if params[:distance].blank? | |
| 118 | + where_code = [] | |
| 119 | + [ :city, :state, :country ].each do |place| | |
| 120 | + unless params[place].blank? | |
| 121 | + # ... So we must to find on this named location | |
| 122 | + # TODO: convert location attrs to a table collumn | |
| 123 | + where_code << "(profiles.data like '%#{place}: #{params[place]}%')" | |
| 124 | + end | |
| 125 | + end | |
| 126 | + self.where where_code.join(' AND ') | |
| 127 | + else # Filter in a georef circle | |
| 128 | + unless params[:lat].blank? && params[:lng].blank? | |
| 129 | + lat, lng = [ params[:lat].to_f, params[:lng].to_f ] | |
| 130 | + end | |
| 131 | + if !lat | |
| 132 | + location = [ params[:city], params[:state], params[:country] ].compact.join(', ') | |
| 133 | + if location.blank? | |
| 134 | + return Exception.new ( | |
| 135 | + _('You must to provide `lat` and `lng`, or `city` and `country` to define the center of the search circle, defined by `distance`.') | |
| 136 | + ) | |
| 137 | + end | |
| 138 | + lat, lng = Noosfero::GeoRef.location_to_georef location | |
| 139 | + end | |
| 140 | + dist = params[:distance].to_f | |
| 141 | + self.where "#{Noosfero::GeoRef.sql_dist lat, lng} <= #{dist}" | |
| 142 | + end | |
| 143 | + end | |
| 144 | + | |
| 103 | 145 | include TimeScopes |
| 104 | 146 | |
| 105 | 147 | def members | ... | ... |