отображение информации о таблице соединений с результатом solr в представлении

У меня есть коллекция тканей, каждая ткань имеет много цветов.

Моя ассоциация БД Fabric has_many Colors через Fabric_colours

Я использую solr для индексации своих Fabric, поэтому структурирование сложных SQL-запросов невозможно.

Модель соединения Fabric_colours содержит процент ткани fabric_id color_id.

Модель Colors содержит шестнадцатеричное значение каждого цвета.

Я хотел бы отобразить в моем представлении,

каждый цвет, присутствующий в указанной ткани, процент, в котором указанный цвет присутствует

Мое представление загружает десятки тканей одновременно, и я не хочу выполнять дополнительные запросы для получения этой информации. Насколько я понимаю, Solr собрал все данные связанной таблицы в один «документ», поэтому в этом нет необходимости.

В настоящее время в моем фрагменте _fabric у меня есть следующий код, показывающий цвета, присутствующие в этой ткани.

    <% fabric.colours.each do |c| %>
        <%= c.hex %>
    <% end%>

как бы я назвал конкретную запись в таблице соединений, связывающую ткань и этот конкретный цвет, для извлечения процента?


person RMcNairn    schedule 22.09.2012    source источник


Ответы (1)


Solr может хранить данные внутри своего индекса, поэтому он не попадет в базу данных, когда вы захотите отобразить данные. Я рекомендую вам гем sunspot, который поможет вам достичь этого. Проверьте его вики, особенно Настройка классов для поиска и индексирование, где это описано.

Имейте в виду, что этот способ приводит к удвоению данных — у вас будут одни и те же данные, хранящиеся в базе данных и в индексе solr.

Вместо того, чтобы хранить данные в solr-индексе, я советую вам использовать жадную загрузку. Вы можете предварительно загрузить проценты цвета, а также цветовые объекты в контроллере.

def show
  # Loads fabrics, the join table and colours
  @fabrics = Fabric.includes(:fabric_colours => [:colour])... # .all or .where or whatever
end

def search
  # Searches for fabrics with eager loading
  search = Fabric.search(:include => { :fabric_colours => :colour }) do
    # ... search criteria
  end
  @fabrics = search.results
end

Если это все еще медленно для вас, используйте кэширование.

person david89    schedule 23.09.2012