Проблема модельного объединения в Rails - PullRequest
1 голос
/ 15 января 2012

Надеюсь, это будет просто.Но я охотился уже пару часов и не могу заставить это работать.У меня есть пользователи с несколькими адресами, я пытаюсь использовать Geocoder gem для отображения этих пользователей с помощью поиска по почтовому индексу, мой код очень похож на то, что есть в Geocoder Railscast.

Вот моя попытка контроллера 1и возвращает "неопределенный метод` Адреса '"

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

Это попытка номер 2, это возвращает" неинициализированную константу ProfilesController :: Addresses "(я не знаю, будет ли работать бит Profile.where, ноэто даже не доходит до этой части ...)

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

Вот мои модели:

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?

Большое спасибо за взгляд!

Ответы [ 3 ]

1 голос
/ 15 января 2012

Дополнительно, вы можете перейти на следующее, чтобы получить все профили:

addresses = Address.near(params[:search], 25, :order => :distance)

@profiles = addresses.map{ |ad| ad.profile }.uniq unless addresses.nil?

Если есть совпадающие адреса, найдите профиль по каждому адресу.

0 голосов
/ 02 января 2013

Я обнаружил, что не могу сразиться с принятым ответом. Итак, я получил довольно грязный:

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')

Если у кого-нибудь есть более хороший, масштабируемый способ сделать это (желательно с помощью прицелов), я бы с удовольствием это услышал.

0 голосов
/ 15 января 2012

Для номера 2 вы должны изменить с Addresses.near(params[:search], 25, :order => :distance) на Address.near(params[:search], 25, :order => :distance).

...