rails搜索许多表

时间:2013-12-18 04:06:33

标签: ruby-on-rails ruby-on-rails-3.2

我有一些似乎无法解决的复杂搜索查询。我有三张桌子。

项目,地区,类型

模式

create_table "Items"
 t.integer  "item_id"
 t.string   "name",
 t.datetime "created_at",
 t.datetime "updated_at",
 t.integer  "year",
 t.float    "price",

create_table "Regions"
 t.integer  "region_id"
 t.float    "name",

create_table "Type"
 t.integer  "item_id"
 t.float    "name",
 t.integer  "item_number"

我正在考虑根据上述方案创建一个搜索功能,以输出结果,然后比较两个项目的价格。

查看

<%= form_tag vpc_search_path do |f| %>

<h5>Select Item One</h5>
<%= select_tag :item_one, options_from_collection_for_select(@item, "item_id", "name"), include_blank: false %>

<h5>Select Item Two</h5>
<%= select_tag "variety_two", options_from_collection_for_select(@item, "item_id", "name"), include_blank: false %>

<% @type.each do |i| %>
<div class="checkbox inline"><%= check_box_tag :type, i.name, {:checked => true} %>
</div>
<% end %>

<% @years.each do |y| %>
<%= check_box_tag :year, y.year %> <%= y.year %></br>
<% end %>

<% @regions.each do |r| %>
<%= check_box_tag :regions, r.region_id, {:checked => true} %> <%= r.name %></br>
<% end %>

<%= submit_tag "Compare" %>
<% end %>

我希望能够搜索匹配“项目”中的“名称”,然后根据地区,类型和年份输出平均价格。我似乎遇到的一个问题是搜索只识别“选择项目2”选项,而不是两者。

Result View

<h2>Item Results</h2>

We found <%= @count %> items that matched your options, spanning <%= @years %> years and <%= @regions %> regions

<table class="table">
 <th></th>
 <th><%= @item_one %></th>
 <th><%= @item_two %></th>
 <th>Difference</th>
<tr>
<td>Price</td>
 <% @comparison.each do |v| %>
<td><%= v.price1 %></td>
<td><%= v.price2 %></td>
<td><%= v.price1 - v.price2 %></td>
</tr>
</table>
<% end %>

控制器

def index
    all = Items.select(:item_id)
    @item = Item.where(:item_id => all).order('item_name DESC')
    @years = Item.select('DISTINCT year') 
    @regions = Region.all
    @type = Type.select('DISTINCT name').order('name ASC')
  end

  def search
   @comparison = Item.where(:item_id => params[:item_one], :item_id => params[:item_two], :year => params[:year])
   @count = @comparison.count
   @years = @comparison.count(params[:year])
   @item_one = Item.where('item_id = ?', params[:item_one]).group('name').select('name')
   @item_two = Item.where('item_id = ?', params[:item_two]).group('name').select('name')
  end

1 个答案:

答案 0 :(得分:0)

  

“我希望能够搜索匹配'项目'中的'名称'   根据地区,类型和年份输出平均价格“。

也许这种关系应该是这样的。

本期特价货品&GT;属于区域
本期特价货品&GT;属于Type(s)

然后,如果想要搜索项目,只使用一个查询给出名称和年份。

Item.select("i.name").from("Items i, Regions r, Types t").
where("i.region_id = r.region_id").
where("i.type_id = t.type_id").
where("i.name=?", params[:name]).
where("i.year=?", params[:year])

提示*
Ruby on Rails遵循语言约定,因此最好将“类型”表重命名为“类型” 因为model表示单个实体,而数据库表由许多实体组成。