我在使用rails应用程序中搜索多个表时遇到了一些问题,我不确定采用这种方法的最佳方法。
我有两个表:Trial(has_many:results)和Result(belongs_to:trial)。我想创建一个搜索表单来访问这两个表并获取相关结果。
我想根据年份,灌溉(0,1,2整数)以及3列表中的区域和列表,将'variety_one'中的数据与我的表单中的'variety_two'进行比较。第一列是'Variety One'秒'Varety Two',第三列是前两者的差异。即。
结果有列:variety_id(涉及:variety_one和:variety_two params),years 试验有列: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>
答案 0 :(得分:0)
确定。通常,对于表,您希望在循环中每次迭代显示一行,因此您的开始tr元素将紧跟在@ result.each行之后,而结束tr将在结束之后。
真正的困难似乎是将结果和试验结合在一起。是否有可能创建一个哈希数组,每个哈希两个键:'结果'和'试用'?然后,您将迭代该数组,并从每个哈希中获取值。但是,这里没有足够的信息来了解这是否可行。问题是如果@result包含一堆结果并且@trial包含一堆试验,你怎么知道哪个与哪个有关?
我也看到了在视图中嵌入太多逻辑和计算的真正危险。您可能想要考虑演示者模式,要么制作自己的演示者对象,要么使用像draper这样的宝石。在视图中,您只需声明每个内容,并将其计算的详细信息保留在预输入类中。