Problema de associação de modelo no Rails
-
28-10-2019 - |
Pergunta
Esperamos que seja simples.Mas eu cacei por algumas horas agora e não consigo fazer isso funcionar.Tenho usuários que têm vários endereços, estou tentando usar Geocoder gem para exibir esses usuários por uma pesquisa de CEP, meu código é muito semelhante ao que está no Geocoder Railscast.
Aqui está minha tentativa de controlador 1 e retorna "método indefinido` Endereços '"
def index
if params[:search].present?
@profiles = Profile.Addresses.near(params[:search], 25, :order => :distance)
@title = "Therapists Near " + :search
else
@profiles = Profile.all
@title = "Everyone"
end
end
Esta é a tentativa número 2, que retorna "constante não inicializada ProfilesController :: Addresses" (não sei se o bit Profile.where vai funcionar, mas nem chega a essa parte ...)
class ProfilesController < ApplicationController
def index
if params[:search].present?
addresses = Addresses.near(params[:search], 25, :order => :distance)
@profiles = Profile.where(:id => addresses.id)
@title = "Therapists Near " + :search
else
@profiles = Profile.all
@title = "Everyone"
end
end
Estes são meus modelos:
class Profile < ActiveRecord::Base
has_many :addresses, :dependent => :destroy
accepts_nested_attributes_for :addresses, :reject_if => lambda { |a| a[:street].blank? }, :allow_destroy => true
class Address < ActiveRecord::Base
belongs_to :profile
geocoded_by :street
after_validation :geocode, :if => :street_changed?
Muito obrigado por dar uma olhada!
Solução
Além disso, você pode alterar o seguinte para obter todos os perfis:
addresses = Address.near(params[:search], 25, :order => :distance)
@profiles = addresses.map{ |ad| ad.profile }.uniq unless addresses.nil?
Se houver endereços correspondentes, encontre o perfil de cada endereço.
Outras dicas
Para o número 2, você deve alterar de Addresses.near(params[:search], 25, :order => :distance)
para Address.near(params[:search], 25, :order => :distance)
.
Descobri que não conseguia paginar com a resposta aceita.Então eu fiquei muito sujo:
addresses = Address.near(params[:search], 25, :order => :distance)
locations_id_array = []
addresses.each do |address|
addresses_id_array << address.id
end
@profiles = Profile.where(:address_id => addresses_id_array).paginate(:page => params[:page], :per_page => 5).order('name DESC')
Se alguém tiver uma maneira mais agradável e escalonável de fazer isso (de preferência com escopos), adoraria saber.