2011-03-05 13 views
8

Así que encontré mucha información excelente sobre Autocompletar para Rails 3, parece realmente fácil de usar. Pero tengo un caso de uso que no se ajusta y necesito algunos consejos.Rails 3 Autocompletar a través de múltiples modelos

Quiero dar al usuario la posibilidad de agregar productos y servicios a una factura a través de un formulario simple. Me gustaría que puedan escribir en el campo Elemento y hacer que se complete automáticamente tanto en Product.name como en Service.name como un único conjunto.

Estoy pensando en intentar escribir un modelo principal que cubra los tres, pero aún así no creo que resuelva mi problema ya que no puedo usar una función en la definición de autocompletar por lo que entiendo.

¿Algún consejo sobre cómo podría tratar de lograr esto? Incluso con los simples ejemplos de búsqueda que están por ahí, parecen estar restringidos a un solo modelo.

Respuesta

4

Si usted no está opone a la introducción de Redis en la mezcla, echar un vistazo a https://github.com/seatgeek/soulmate - Desde el README:

alma gemela es una herramienta para ayudar a resolver el problema común de desarrollar una función de autocompletar rápido. Utiliza los conjuntos ordenados de Redis para construir un índice de palabras parcialmente completadas y los elementos de coincidencia superior correspondientes, y proporciona una aplicación de sinatra simple para consultarlos. Soulmate termina tus oraciones.

alma gemela fue diseñado para ser simple y rápido, y ofrece lo siguiente:

  • proporcionar sugerencias para múltiples tipos de elementos en una sola consulta (en SeatGeek estamos autocompletar para los artistas, eventos y lugares)
  • Los resultados se ordenan por un marcador
  • metadatos arbitraria para cada elemento (en SeatGeek estamos almacenar tanto una URL y un subtítulo)

un artículo que he especificado por el usuario sa simple objeto JSON que se parece a:

{ 
    "id": 3, 
    "term": "Citi Field", 
    "score": 81, 
    "data": { 
    "url": "/citi-field-tickets/", 
    "subtitle": "Flushing, NY" 
    } 
} 

Dónde id es un identificador único (en el tipo específico), term es la frase que desea proporcionar terminaciones para, score es un ranking especificados por el usuario métricas (Redis se ordene cosas lexicográficamente para artículos con el mismo puntaje), y data es un contenedor opcional para los metadatos que desea devolver cuando se combina este artículo (en SeatGeek, incluimos una url para el artículo, así como un subtítulo para cuando presentarlo en un menú desplegable de autocompletar).

Ver Soulmate en acción en SeatGeek.

Si nada más, tal vez le dará algunas ideas sobre cómo estructurar los datos de una manera que tenga sentido.

No escribí ni tuve nada que ver con alma gemela. Es solo una biblioteca que descubrí cuando intentaba resolver un problema similar. ¡Espero eso ayude!

1

Si el autocompletado del lado del cliente es una opción (p.usted tiene pocos productos y servicios), usted podría ir con jQuery autocompletado:

controlador:

@keys = @categories.map { |x| x.name } + @entries.map { |x| x.description } 
@autocomplete_categories = @keys.to_json.html_safe 

vista:

<script type="text/javascript"> 
$(document).ready(function() { 
    var data = <%= @autocomplete_categories %>; 
    $("#auto").autocomplete({ source: data }); 
}); 
</script> 

<input type="text" name="auto" id="auto" /> 
Cuestiones relacionadas