геокодирование 2 адресов с помощью geocoder gem

#ruby-on-rails #google-geocoder #rails-postgresql

#ruby-on-rails #google-геокодер #rails-postgresql

Вопрос:

Я пытаюсь геокодировать 2 адреса, которые запрашиваются в 1 форме.

   <%= f.input :kotadres %>
  <%= f.input :location %>
  

Оба они работают с автозаполнением Google следующим образом:

 <script>
  var input = document.getElementById('student_location');
  var autocomplete = new google.maps.places.Autocomplete(input,{componentRestrictions: {country:'be'}});
  google.maps.event.addListener(autocomplete, 'place_changed', function(){
  var place = autocomplete.getPlace();
  })
</script>

<script>
  var input = document.getElementById('student_kotadres');
  var autocomplete = new google.maps.places.Autocomplete(input,{componentRestrictions: {country:'be'}});
  google.maps.event.addListener(autocomplete, 'place_changed', function(){
  var place = autocomplete.getPlace();
  })
</script>
  

Это работает отлично, потому что оба адреса хранятся в базе данных.

Теперь я хочу геокодировать эти 2 адреса в своей базе данных. Это уже работает на 50%, потому что по какой-то причине он всегда геокодирует :kotadres в столбец: широта и : долгота, но я понятия не имею, почему он геокодирует только этот атрибут, а не атрибут :location.

Это таблица моих студентов:

   create_table "students", force: :cascade do |t|
    t.string   "location"
    t.float    "latitude"
    t.float    "longitude"
    t.string   "kotadres"
  end
  

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

В принципе, я хочу понять, почему он геокодирует только атрибут :kotadres, а не атрибут :location. Я попробовал следующие вещи:

  • с помощью обоих полей ввода в форме (результат: только: kotadres получает геокодирование)
  • удалите поле ввода :kotadres (результат: :местоположение не геокодируется)

Моя студенческая модель выглядит так:

 geocoded_by :location
after_validation :geocode, if: :location_changed?

geocoded_by :kotadres
after_validation :geocode, if: :kotadres_changed?
  

Итак, если кто-то знает, как геокодировать эти 2 адреса или если кто-то знает, почему он всегда геокодирует атрибут :kotadres, я более чем рад узнать ответы.

Комментарии:

1. Вам следует серьезно подумать об использовании отдельной модели адресов и настройке отношения «один ко многим». Ваша текущая проблема также связана с тем, что вы объединяете все в единую модель.

Ответ №1:

Хитрость здесь не в том, чтобы делать все в одной модели:

 class Student
  has_many :addresses
  accepts_nested_attributes_for :addresses
end

# latitude:float 
# longitude:float
class Address 
  enum type: [:home, :work, :billing] #etc
  belongs_to :student
  geocoded_by :full_street_address 
  after_validation :geocode, if: :full_street_address_changed?
end
  

Чтобы настроить форму, которая позволяет учащемуся настраивать несколько адресов одновременно, вы должны сделать:

 <%= form_for(@student) do |f| %>
  <%= f.fields_for :addresses do |a| %>
    <%= a.text_field :full_street_address %>
  <% end %>
<% end %>
  

Вам также необходимо настроить контроллер:

 class StudentsController 

  def new
    @student = Student.new do |s|
      s.addresses.new
      s.addresses.new
    end
  end

  def create
    @student = Student.new(student_params)
  end

  private 

    def student_params
      params.require(:student).permit(
         :foo,
         :bar,
         addresses_attributes: [
           :full_street_address
         ]
      )
    end
end
  

Смотрите:

Комментарии:

1. Это не исправление, а скорее толчок в правильном направлении, и вам потребуется адаптировать решение к вашей ситуации.

2. Если вы хотите отслеживать как адреса пользователей, так и текущее местоположение, вы бы геокодировали местоположение для студентов и адреса отдельно.