У меня есть форма, представленная в rails, где пользователь вводит свой почтовый индекс. У меня есть таблица с тысячами и тысячами почтовых индексов вместе со своей долготой и широтой.
Есть ли способ настроить некоторые скрытые поля формы или в контроллере, вытащить long и lat из таблицы zipcode и сохранить их в профиле пользователя?
Или, возможно, установить отношения в базе данных, которые это делают?
У вас есть 2 варианта, поместив zip с долготой и широтой внутри пользовательской модели (будучи ненормализованной) или имея отношения "один-много" между пользователями и zip (нормализованный)
class User < ActiveRecord::Base
belongs_to :zip
end
class Zip < ActiveRecord::Base
has_many :users, :autosave => true
end
Тогда, на ваш взгляд, вы можете:
<% semantic_form_for @user do |form| %>
standard form input stuff here.
<%= text_field_tag "zip_text" %> # This puts a text field in the form that is not
#tied to the user. Thus when the form is submitted, if you examine the params hash you
#will see that the field zip_text is not within the user hash. Indeed it will be
#structured like this params = {:type => "commit", :id => 1, :zip_text => 96822,
#:users_attributes => {Users stuff in here}}
<% end %>
Затем в вашем контроллере вы можете:
@user = User.find(params[:id])
@zip = Zip.find(params[:zip_text])
@user.zip << @zip
@user.save
Для меня это более эффективно, чтобы сделать это таким образом, и чтобы zip-вход представлял собой простой текстовый ввод, затем просматривайте zip-поиск и последующую связь (выполняемую с <<), обрабатываемую в контроллере, особенно если вы собираетесь несколько тысяч почтовых индексов.