Ransack:显示按Ransack排序的has_many关系的属性

时间:2018-06-07 08:48:05

标签: ruby-on-rails ruby ransack

我有Commodity(name:string)模型和Price(amount:float)模型,以便:

class Commodity < ApplicationRecord
  has_many :prices
end

class Price < ApplicationRecord
  belongs_to :commodity
end

因此,一种商品可以有很多价格。

我有一个商品的Ransack搜索表单,显然可以让用户搜索商品。我希望包含一个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作为占位符。如何使用Ransack在排序时找到的amount替换它?

2 个答案:

答案 0 :(得分:1)

我建议创建一个范围以包含Commodity实例的价格。 e.g。

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>

答案 1 :(得分:0)

有一些缺失的信息要清楚,但是,它很简单。甚至你有答案,如果你有你发布的例子中的关联,那么它必须使用你发送的代码

sort_link(@q, :prices_amount)

其中&#34;价格&#34;是协会的名称和&#34;金额&#34;是你的属性。