在 rails 中进行联合搜索
Doing a joined search in rails
我正在 rails 项目中进行简单的联合搜索。我想要做的是根据用户在搜索框中输入的内容找到项目的描述。我最常遇到的错误是:
Mysql2::错误:'where clause' 中的未知列 'item.description':SELECT item_instances
。* FROM item_instances
INNER JOIN items
ON items
.id
= item_instances
.item_id
其中 item
.description
= 'server'
search.html.erb 页面如下所示:
<p>
Search results base on database field <span class='bold'><%= @columnType %></span>
with value: <span class='bold'><%= @search_value %> </span>
</p>
<p>Total Report Cost: <span class='bold'>$<%= @cost %><span></p>
<table class='reportTable'>
<thead>
<tr>
<th class='reportTableHeaderCell'>Inv number</th>
<th class='reportTableHeaderCell'>Description</th>
<th class='reportTableHeaderCell'>Serial</th>
<th class='reportTableHeaderCell'>PO number</th>
<th class='reportTableHeaderCell'>PO date</th>
<th class='reportTableHeaderCell'>Invoice</th>
<th class='reportTableHeaderCell'>Date Out</th>
<th class='reportTableHeaderCell'>Cost</th>
<th class='reportTableHeaderCell'>Acro</th>
</tr>
</thead>
<tbody>
<% @item_instances.each do |item_instance| %>
<tr class='searchTableRow'>
<td class='reportTableCell'><%= link_to item_instance.inv_number, edit_item_instance_path(item_instance) %></td>
<td class='reportTableCell'><%= item_instance.item.description %></td>
<td class='reportTableCell'><%= item_instance.serial %></td>
<td class='reportTableCell'><%= item_instance.po_number %></td>
<td class='reportTableCell'><%= item_instance.po_date %></td>
<td class='reportTableCell'><%= item_instance.invoice %></td>
<td class='reportTableCell'><%= item_instance.date_out %></td>
<td class='reportTableCell'><%= item_instance.cost %></td>
<td class='reportTableCell'><%= item_instance.acro %></td>
</tr>
<% end %>
</tbody>
</table>
item_instances.rb(型号)文件
class ItemInstance < ApplicationRecord
validates :inv_number, :serial, :cost, presence: true
belongs_to :item
scope :in_order, ->{order(:description)}
# Named Scopes
scope :search_for_records_by_date, ->(startDate, endDate) { where(date_out: startDate..endDate) }
scope :search_for_records_by_column_and_value, ->(columnName, value) { where("#{columnName}": "#{value}") }
#I know something may be wrong in here.
scope :search_for_records_by_column_and_value_item_table, ->(columnName, value) { where(item: "#{columnName}": "#{value}") }
end
物品型号:
class Item < ApplicationRecord
validates :description, :cost, :list_price, presence: true
has_many :item_instances, dependent: :delete_all
scope :in_order, ->{order(:description)}
scope :search_for_active_items, ->(active) { where(active: active) }
scope :search_for_records_by_column_and_value_on_items, ->(columnName, value) { where("#{columnName}": "#{value}") }
end
item_instances 控制器:
class ItemInstancesController < ApplicationController
def search
# Getting the params from what the user submitted
@columnType = params[:columnType]
@search_value = params[:search_value]
if @columnType == 'description'
# SIMPLE THINGS I've TRIED:
# @item_instances = ItemInstance.joins(:item).where(item: {description: "server"})
#@item_instances = ItemInstance.joins(:items)
#I TRIED THIS JUST TO SEE IF I COULD GET ANYTHING
@item_instances = ItemInstance.joins(:item).where(:item => {description: "server"})
#@item_instances = ItemInstance.joins(:item).search_for_records_by_column_and_value_item_table(@columnType, @search_value)
end
respond_to do |format|
format.html { render :search }
end
end
end
路由文件:
Rails.application.routes.draw do
resources :item_instances
get '/report', to: 'item_instances#report'
get '/search', to: 'item_instances#search'
resources :items
get '/active', to: 'items#active'
# Route to the home page
root 'item_instances#home'
end
schema.rb 文件:
ActiveRecord::Schema.define(version: 2020_08_17_190727) do
create_table "item_instances", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.integer "inv_number"
t.string "serial"
t.integer "po_number"
t.date "po_date"
t.date "invoice"
t.date "date_out"
t.decimal "cost", precision: 8, scale: 2
t.string "acro"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "item_id"
t.index ["item_id"], name: "fk_rails_6ea33fd9d0"
end
create_table "items", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.string "description"
t.decimal "cost", precision: 8, scale: 2
t.decimal "list_price", precision: 8, scale: 2
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "active"
end
add_foreign_key "item_instances", "items"
end
如果还需要什么,请告诉我。我浏览了多篇文章和 Whosebug 帖子,但没有成功。任何可以提供帮助的东西都将不胜感激。
在您的 item_instances_controller.rb 中,将 item 替换为 where 条件下的项目。在 where 条件下,您必须指定完整的 table 名称以进行比较。
class ItemInstancesController < ApplicationController
def search
#yourcode
@item_instances = ItemInstance.joins(:item).where(:items => {description: "server"})
#yourcode
end
end
我正在 rails 项目中进行简单的联合搜索。我想要做的是根据用户在搜索框中输入的内容找到项目的描述。我最常遇到的错误是:
Mysql2::错误:'where clause' 中的未知列 'item.description':SELECT item_instances
。* FROM item_instances
INNER JOIN items
ON items
.id
= item_instances
.item_id
其中 item
.description
= 'server'
search.html.erb 页面如下所示:
<p>
Search results base on database field <span class='bold'><%= @columnType %></span>
with value: <span class='bold'><%= @search_value %> </span>
</p>
<p>Total Report Cost: <span class='bold'>$<%= @cost %><span></p>
<table class='reportTable'>
<thead>
<tr>
<th class='reportTableHeaderCell'>Inv number</th>
<th class='reportTableHeaderCell'>Description</th>
<th class='reportTableHeaderCell'>Serial</th>
<th class='reportTableHeaderCell'>PO number</th>
<th class='reportTableHeaderCell'>PO date</th>
<th class='reportTableHeaderCell'>Invoice</th>
<th class='reportTableHeaderCell'>Date Out</th>
<th class='reportTableHeaderCell'>Cost</th>
<th class='reportTableHeaderCell'>Acro</th>
</tr>
</thead>
<tbody>
<% @item_instances.each do |item_instance| %>
<tr class='searchTableRow'>
<td class='reportTableCell'><%= link_to item_instance.inv_number, edit_item_instance_path(item_instance) %></td>
<td class='reportTableCell'><%= item_instance.item.description %></td>
<td class='reportTableCell'><%= item_instance.serial %></td>
<td class='reportTableCell'><%= item_instance.po_number %></td>
<td class='reportTableCell'><%= item_instance.po_date %></td>
<td class='reportTableCell'><%= item_instance.invoice %></td>
<td class='reportTableCell'><%= item_instance.date_out %></td>
<td class='reportTableCell'><%= item_instance.cost %></td>
<td class='reportTableCell'><%= item_instance.acro %></td>
</tr>
<% end %>
</tbody>
</table>
item_instances.rb(型号)文件
class ItemInstance < ApplicationRecord
validates :inv_number, :serial, :cost, presence: true
belongs_to :item
scope :in_order, ->{order(:description)}
# Named Scopes
scope :search_for_records_by_date, ->(startDate, endDate) { where(date_out: startDate..endDate) }
scope :search_for_records_by_column_and_value, ->(columnName, value) { where("#{columnName}": "#{value}") }
#I know something may be wrong in here.
scope :search_for_records_by_column_and_value_item_table, ->(columnName, value) { where(item: "#{columnName}": "#{value}") }
end
物品型号:
class Item < ApplicationRecord
validates :description, :cost, :list_price, presence: true
has_many :item_instances, dependent: :delete_all
scope :in_order, ->{order(:description)}
scope :search_for_active_items, ->(active) { where(active: active) }
scope :search_for_records_by_column_and_value_on_items, ->(columnName, value) { where("#{columnName}": "#{value}") }
end
item_instances 控制器:
class ItemInstancesController < ApplicationController
def search
# Getting the params from what the user submitted
@columnType = params[:columnType]
@search_value = params[:search_value]
if @columnType == 'description'
# SIMPLE THINGS I've TRIED:
# @item_instances = ItemInstance.joins(:item).where(item: {description: "server"})
#@item_instances = ItemInstance.joins(:items)
#I TRIED THIS JUST TO SEE IF I COULD GET ANYTHING
@item_instances = ItemInstance.joins(:item).where(:item => {description: "server"})
#@item_instances = ItemInstance.joins(:item).search_for_records_by_column_and_value_item_table(@columnType, @search_value)
end
respond_to do |format|
format.html { render :search }
end
end
end
路由文件:
Rails.application.routes.draw do
resources :item_instances
get '/report', to: 'item_instances#report'
get '/search', to: 'item_instances#search'
resources :items
get '/active', to: 'items#active'
# Route to the home page
root 'item_instances#home'
end
schema.rb 文件:
ActiveRecord::Schema.define(version: 2020_08_17_190727) do
create_table "item_instances", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.integer "inv_number"
t.string "serial"
t.integer "po_number"
t.date "po_date"
t.date "invoice"
t.date "date_out"
t.decimal "cost", precision: 8, scale: 2
t.string "acro"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "item_id"
t.index ["item_id"], name: "fk_rails_6ea33fd9d0"
end
create_table "items", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
t.string "description"
t.decimal "cost", precision: 8, scale: 2
t.decimal "list_price", precision: 8, scale: 2
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "active"
end
add_foreign_key "item_instances", "items"
end
如果还需要什么,请告诉我。我浏览了多篇文章和 Whosebug 帖子,但没有成功。任何可以提供帮助的东西都将不胜感激。
在您的 item_instances_controller.rb 中,将 item 替换为 where 条件下的项目。在 where 条件下,您必须指定完整的 table 名称以进行比较。
class ItemInstancesController < ApplicationController
def search
#yourcode
@item_instances = ItemInstance.joins(:item).where(:items => {description: "server"})
#yourcode
end
end