多表搜索 Rails



我在 rails 应用程序中搜索多个表时遇到了一些问题,我不确定解决此问题的最佳方法。

我有两个表:试验(has_many:结果)和结果(belongs_to:试验)。我想创建一个搜索表单,该表单命中这两个表并获取相关结果。

我想根据年份、灌溉(0,1,2 整数)和地区将表格中的"variety_one"与"variety_two"中的数据进行比较,并在 3 列表中列出。第一列是"品种一",第二列是"Varety Two",第三列是前一列两者之间的差异。即

结果包含列:variety_id(与 :variety_one 和 :variety_two 参数相关)、年份试验有柱: region_id, 灌溉

       | Variety One | Variety Two | Different
Yield  |   5.00      |    4.00     |  1.00
length |   1.00      |    0.50     |  0.50

我的观点

<%= simple_form_for :search, url: vpc_search_path do |f| %>
<%= f.select :variety_one, @variety.collect {|v| [v.variety_name, v.variety_id]}, :selected => '2300', :include_blank => false %>
<%= f.select :variety_two, @variety.collect {|v| [v.variety_name, v.variety_id]}, :selected => '2308', :include_blank => false %>
<%= f.input :irrigated, collection: @irrigations, as: :check_boxes, :input_html => {:checked => true} %>
<%= f.input :years, collection: @years, as: :check_boxes, :input_html => {:checked => true} %>
<%= f.input :regions, collection: @regions, as: :check_boxes, :input_html => {:checked => true} %>
<%= f.button :submit %>
<% end %>

我的控制器

class VpcController < ApplicationController
  def index
    all = Result.select(:variety_id)
    @variety = Variety.where(:variety_id => all).order('variety_name DESC')
    @years = Result.select('DISTINCT year').pluck(:year)
    @regions = Trial.select('DISTINCT region_id').pluck(:region_id)
    @irrigations = Trial.select('DISTINCT irrigated').pluck(:irrigated)
  end
  def search
   @result = Result.search(params[:search])
   @trial = Trial.search(params[:search])
  end
end

搜索视图

<table class="table">
        <th></th>
    <th>Variety One</th>
    <th>Variety Two</th>
    <th>Difference</th>
<tr>
<td>Yield (bales/ha)</td>
<% @result.each do |v| %>
<td><%= "%.2f" % (v.lint) %></td>
<td><%= v.length %></td>
<td><%= ?? %></td>
<td></td>
<td></td>
<% end %>
</tr>
</table>

好的。通常,对于表,您希望为循环中的每次迭代显示一行,因此您的开始 tr 元素将紧跟在 @result.each 行之后,而结束 tr 就在末尾上方。

真正的困难似乎是将结果和试验放在一起。是否有可能创建一个哈希数组,每个哈希有两个键:"结果"和"试验"?然后,您将遍历该数组,并从每个哈希中获取值。但是这里没有足够的信息来知道这是否是一种可行的方法。问题是,如果@result包含一堆结果,而@trial包含一堆试验,你如何判断哪个与哪个?

我还看到了在视图本身中嵌入过多逻辑和计算的真正危险。您可能需要考虑演示器模式,要么创建自己的演示器对象,要么使用像 draper 这样的 gem。这样,在视图中,您只需声明每个事物是什么,并将其计算的详细信息保留在 preenter 类中。

最新更新