2016-03-16 1 views
0

Я хочу объединить данные из двух разных моделей, объединить их в один массив и использовать жемчужину will_paginate, чтобы разбивать результаты на мой взгляд на эту коллекцию. Я уже использую require 'will_paginate/array', чтобы обеспечить нормальный массив без ActiveRecord и все его работу исправно.Объедините 2 модели в один массив, paginate и force 1 partial

Моя проблема заключается в том, что он использует два разных элементарных элемента для визуализации записей, основанных на том, из какой модели были получены данные. Как заставить его визуализировать одну конкретную часть?

Контроллер

def sample_action 
    page = params[:page] || 1 

    @collection = [] 
    @car.messages.select {|msg| @collection << msg} 
    Alerts.where(car_id: @car.id).select {|alerts| @collection << alerts} 

    @collection = @collection.sort{|a,b| b[:created_at] <=> a[:created_at]} 
    @collection = @collection.paginate(:page => page, :per_page => 30) 

    respond_to do |format| 
    format.html { render :sample_action } 
    end 
end 

вид

<% if @collection.count > 0 %> 
    <div class="row"> 
    <div class="col-xs-12"> 
     <div id="car-alerts" class="car-alerts-all"> 
     <%= render @collection -%> 
     </div> 
    </div> 
    </div> 
    <%= will_paginate @collection -%> 
<% else %> 
    <p class="no-alerts-message">Your car is healthy</p> 
<% end %> 

автомобиля частичная

Car - <%= collection.id %> 
<br> 

предупреждение частичного

Alert - <%= collection.id %> 
<br> 

ответ

1

Вы должны перебрать каждый элемент в коллекции и имеет условный на основе типа модели, так, например:

<div id="car-alerts" class="car-alerts-all"> 
    <% @collection.each do |car_or_alert| %> 
    <%= 
    if car_or_alert.is_a?(Alert) 
     render :alert #you need to add locals here as well, but it unclear what locals you are using 
    else 
     render :car #see above 
    end %> 
    <% end %> 
</div> 
+0

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

2

Я хотел бы использовать тот факт, что вы в основном просто хочу, чтобы вывести название модели и сделать это:

<% if @collection.count > 0 %> 
    <div class="row"> 
    <div class="col-xs-12"> 
     <div id="car-alerts" class="car-alerts-all"> 
     <%- @collection.each do |obj| -%> 
      <%= obj.class.to_s -%> - <%= obj.id %> 
     </div> 
    </div> 
    </div> 
    <%= will_paginate @collection -%> 
<% else %> 
    <p class="no-alerts-message">Your car is healthy</p> 
<% end %> 

но было бы легко ломаются, если вы хотите, чтобы добавить метки, отличные от имен классов.

+0

Я не думал о том, чтобы вытащить его из частичного, но это тоже сработает. –

0

Оказывается, это было так просто, как установка парциальное из render

<% if @collection.count > 0 %> 
    <div class="row"> 
    <div class="col-xs-12"> 
     <div id="car-alerts" class="car-alerts-all"> 
     <%= render collection: @collection, partial: 'car/partial_name' -%> 
     </div> 
    </div> 
    </div> 
    <%= will_paginate @collection -%> 
<% else %> 
    <p class="no-alerts-message">Your car is healthy</p> 
<% end %> 

Это является ключевым изменением -

<%= render collection: @collection, partial: 'car/partial_name' -%> 
Смежные вопросы