Ransack:显示按 Ransack 排序的 has_many 关系的属性
Ransack: Show the attribute of a has_many relationship sorted by 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)
排序过滤器。点击这个link应该会显示所有商品按价格排序(如果一个商品有多个价格,该商品会显示多次,每个重复的商品价格相应显示)。目前,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
替换它?
需要说明的是,这里缺少一些信息,但是,是的,它很简单。你甚至有答案,如果你有像你发布的例子中那样的关联,那么它必须与你发送的代码一起工作
sort_link(@q, :prices_amount)
其中 "prices" 是协会的名称,"amount" 是您的属性。
我建议创建一个范围以将价格包含在 Commodity
实例中。例如
class Commodity < ApplicationRecord
scope :with_price, -> {joins(:prices).select("commodities.*, prices.amount as price_amount")}
end
这将在您的 Commodity
实例上创建一个虚拟属性 price_amount
在控制器中它会像
@q = Commodity.ransack(params[:q])
@commodities = @q.result.with_price
假设您 "Displaying" 这些是 table 您可以使用以下
按要求显示结果
<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>
我有一个 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)
排序过滤器。点击这个link应该会显示所有商品按价格排序(如果一个商品有多个价格,该商品会显示多次,每个重复的商品价格相应显示)。目前,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
替换它?
需要说明的是,这里缺少一些信息,但是,是的,它很简单。你甚至有答案,如果你有像你发布的例子中那样的关联,那么它必须与你发送的代码一起工作
sort_link(@q, :prices_amount)
其中 "prices" 是协会的名称,"amount" 是您的属性。
我建议创建一个范围以将价格包含在 Commodity
实例中。例如
class Commodity < ApplicationRecord
scope :with_price, -> {joins(:prices).select("commodities.*, prices.amount as price_amount")}
end
这将在您的 Commodity
price_amount
在控制器中它会像
@q = Commodity.ransack(params[:q])
@commodities = @q.result.with_price
假设您 "Displaying" 这些是 table 您可以使用以下
按要求显示结果<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>