Problema de asociación de modelos en Rails
-
28-10-2019 - |
Pregunta
Con suerte, esto será sencillo.Pero he cazado durante un par de horas y parece que no puedo hacer que esto funcione.Tengo usuarios que tienen varias direcciones, estoy tratando de usar la gema Geocoder para mostrar estos usuarios mediante una búsqueda de código postal, mi código es muy similar al del Geocoder Railscast.
Aquí está mi intento de controlador 1 y devuelve "método indefinido 'Direcciones'"
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
Este es el intento número 2, esto devuelve "ProfilesController :: Addresses constante no inicializada" (no sé si el bit Profile.where funcionará, pero ni siquiera está llegando a esa 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
Aquí están mis 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?
¡Muchas gracias por echar un vistazo!
Solución
Además, puede cambiar a lo siguiente para obtener todos los perfiles:
addresses = Address.near(params[:search], 25, :order => :distance)
@profiles = addresses.map{ |ad| ad.profile }.uniq unless addresses.nil?
Si hay direcciones coincidentes, busque el perfil de cada dirección.
Otros consejos
Para el número 2, debe cambiar de Addresses.near(params[:search], 25, :order => :distance)
a Address.near(params[:search], 25, :order => :distance)
.
Descubrí que no podía paginar con la respuesta aceptada.Así que me puse bastante sucio:
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')
Si alguien tiene una forma más agradable y escalable de hacer esto (preferiblemente con visores), me encantaría escucharla.