Ransack: Показать атрибут отношения has_many, отсортированный по Ransack - PullRequest
0 голосов
/ 07 июня 2018

У меня есть модель Commodity(name:string) и модель Price(amount:float), такие как:

class Commodity < ApplicationRecord
  has_many :prices
end

И

class Price < ApplicationRecord
  belongs_to :commodity
end

Таким образом, один товар может иметь много цен.

У меня есть поисковая форма Ransack для Commodity, которая, очевидно, позволяет пользователю искать товары.Я хочу включить сортировочный фильтр sort_link(@q, :prices_amount).При щелчке по этой ссылке должны отображаться все товары, отсортированные по их ценам (если один товар имеет несколько цен, этот товар будет отображаться несколько раз, при этом цена каждого повторяющегося товара будет отображаться соответственно).В настоящее время Ransack действительно показывает товар несколько раз (столько же, сколько и количество каждого товара), но я не знаю, как отобразить эту цену для каждого повторяющегося товара.

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

<%=@commodities.each do |commodity|%>
  <%=commodity.name%>    
  <%=commodity.prices.first.amount%> <!-- In place of prices.first, I was to display the amount that Ransack found -->
<%end%>

Я сейчас использую prices.first.amount в качестве заполнителя.Как заменить это на amount, найденный Рансаком при сортировке?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

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

class Commodity < ApplicationRecord
  scope :with_price, -> {joins(:prices).select("commodities.*, prices.amount as price_amount")}
end

Это создаст виртуальный атрибут price_amount в ваших экземплярах Commodity

В контроллере это будет что-то вроде

@q = Commodity.ransack(params[:q])
@commodities = @q.result.with_price

Предполагаетсячто вы «отображаете» их в виде таблицы, вы можете отобразить результаты в соответствии с запросом, используя следующую команду:

<table>
  <thead>
    <tr>
      <th><%= sort_link(@q, :name, 'Commodity' %></th>
      <th><%= sort_link(@q, :prices_amount, 'Price') %></th>
    </tr> 
  </thead>
  <tbody>
    <% @commodities.each do |commodity| %>
      <tr> 
        <td><%= commodity.name %></td>
        <td><%= number_to_currency(commodity.price_amount) %></td>
      </tr>
    <% end %>
  </tbody>
</table>
0 голосов
/ 08 июня 2018

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

sort_link(@q, :prices_amount)

, где «Цены» - это название ассоциации, а «сумма "это ваш атрибут.

...