Rails 3 Autocomplete на нескольких моделях - PullRequest
8 голосов
/ 06 марта 2011

Итак, я нашел отличную информацию об Autocomplete для Rails 3, она выглядит очень простой в использовании.Но у меня есть вариант использования, который не подходит, и мне нужен совет.

Я хочу дать пользователю возможность добавлять Продукты и Услуги в Счет-фактуру с помощью простой формы.Я хотел бы, чтобы они могли вводить в поле Item и иметь автозаполнение как из Product.name, так и Service.name как единый набор.

Я думаю о попытке написать родительскую модель, котораяперекрывает все три, но я все еще не думаю, что это решает мою проблему, так как я не могу использовать функцию в определении автозаполнения из того, что я понимаю.

Любой совет, как я мог бы попытаться достичь этого?Даже с простыми примерами поиска, которые существуют, они ограничиваются одной моделью.

Ответы [ 2 ]

4 голосов
/ 06 марта 2011

Если вы не против введения Redis в микс, взгляните на https://github.com/seatgeek/soulmate - из README:

Soulmate - это инструмент, помогающий решить общую проблему разработкифункция быстрого автозаполнения.Он использует отсортированные наборы Redis для построения индекса частично заполненных слов и соответствующих элементов, соответствующих наиболее подходящим элементам, и предоставляет простое приложение sinatra для их запроса.Soulmate заканчивает ваши предложения.

Soulmate был разработан, чтобы быть простым и быстрым, и предлагает следующее:

  • Предоставляет предложения для нескольких типов элементов в одном запросе (в SeatGeek мыповторное автозаполнение для исполнителей, событий и мест)
  • Результаты упорядочены по заданному пользователем счету
  • Произвольные метаданные для каждого элемента (в SeatGeek мы храним и URL, и субтитры)

Элемент - это простой объект JSON, который выглядит следующим образом:

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

Где id - уникальный идентификатор (в пределах определенного типа), term - фразавы хотите предоставить дополнения для, score - указанная пользователем метрика ранжирования (redis упорядочит лексикографически для элементов с одинаковым счетом), а data - дополнительный контейнер для метаданных, которые вы хотите вернуть, когда этот элементсовпадает (в SeatGeek мы включили URL-адрес для элемента, а также субтитр, когда мы представляем его в раскрывающемся списке автозаполнения).

См. Soulmate in action в SeatGeek .

Если ничего другого, возможно, это даст вам некоторые идеи о том, как структурировать данные таким образом, который имеет смысл.

Я сделалне писать или иметь какое-либо отношение к родственной душе.Это просто библиотека, которую я обнаружил, пытаясь решить подобную проблему.Надеюсь, это поможет!

1 голос
/ 12 апреля 2011

Если опция автозаполнения на стороне клиента (например, у вас мало продуктов и услуг), вы можете использовать автозаполнение JQuery:

контроллер:

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

представление:

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

<input type="text" name="auto" id="auto" />
...