我試圖在單獨的控制器中對模型執行復雜搜索。我有一個學生模型。整個應用程序有一個單獨的main_controller處理的頭版,它沒有模型。 main_controller及其相關的索引視圖應該提供來自多個模型的首頁和顯示數據。Rails 4在單獨的控制器中搜索幾個模型
現在我想用幾種不同類型的搜索條件搜索模型。搜索標準是字符串比較,數字比較和布爾值(例如,如果爲真,則只顯示活動學生顯示所有學生)。 Railscast #111展示瞭如何基於模型和單獨的搜索控制器創建這樣的搜索。我創建了這樣一個控制器,它工作正常。我堅持在主/索引中顯示相關部分。
下面是代碼:
主/ index.html.haml
- model_class = Adult
- model_class = Pupil
- model_class = MainSearch
.page-header
= render :partial => 'main_searches/form', :main_search => MainSearch.new
只需調用這裏此刻的形式。
型號/ main_search.rb
class MainSearch < ActiveRecord::Base
def pupils
@pupils ||= find_pupils
end
private
def find_pupils
pupils = Pupil.order(:name_sur)
pupils = pupils.where(id: id_search) if id_search.present?
pupils = pupils.where("name_first like ?", "%#{name_first}%") if name_first.present?
pupils = pupils.where("name_sur like ?", "%#{name_sur}%") if name_sur.present?
pupils = pupils.where(active: "true") if active == true #show only active or all
pupils
end
end
這個定義搜索。
控制器/ main_searches_controller.rb
class MainSearchesController < ApplicationController
before_action :set_main_search, only: [:show, :update, :destroy]
def show
@main_search = MainSearch.find(params[:id])
end
def new
@main_search = MainSearch.new
end
def create
@main_search = MainSearch.new(main_search_params)
if @main_search.save
redirect_to root_path, notice: 'Main search was successfully created.'
else
render action: 'new'
end
end
end
如railscast所示。
視圖/ main_searches/_form.html.haml
%h1 Advanced Search
= form_for :main_search, :url => main_searches_path do |f|
.field
= f.label :id_search
%br/
= f.text_field :id_search
[... ommitted some fields here ...]
.field
= f.label :active
%br/
= f.check_box :active, {}, true, false
.actions= f.submit "Search"
在新的視圖中呈現。
的意見/ main_searches/_results.html.haml
%h1 Search Results
.container-fluid
.row-fluid
.span4
%table.table{style: "table-layout:fixed"}
%thead
%tr
%th= "id"
%th= "name_sur"
%th= "name first"
%th= "a"
%div{style: "overflow-y:scroll; height: 200px"}
%table.table.table-striped{style: "table-layout:fixed"}
%tbody
- @main_search.pupils.each do |pupil|
%tr
%td= pupil.id
%td= link_to pupil.name_sur, pupil_path(pupil)
%td= pupil.name_first
%td= pupil.active
顯示結果。
因此,基本上一切都適用於一個模型,如在railscast中所見。我現在需要的 是讓用戶以某種方式處理main_controller中的所有內容。此刻我不能 獲得傳遞給_results.html.haml部分的@main_search對象。我在這裏錯過了什麼? 或者這甚至是做這種搜索的正確方法?
感謝您的幫助提前。
[這是一種方法](https://github.com/codeschool/FeatureFocus/blob/basecamp/app/models/search.rb)我在[視頻](https://www.codeschool。 com/screencasts/basecamp-search)。在你的控制器中,你可以這樣調用它:'@main_search = Search.for(params [:id])''。 – Brian 2014-10-06 19:04:30
是否存在想要在數據庫中存儲搜索的特定原因?我瞭解功能,但似乎特別是對多模型搜索,這可能會變得笨拙,因爲每個模型可能會有它自己的一套特點。這些搜索是否與用戶或其他實體相關聯?如果看起來不像創建抽象(缺少更好的單詞)模型更有意義,而是通過它來運行搜索。 – engineersmnky 2014-10-06 19:25:53
@Brian 謝謝,我會在早上檢查第一件事情。 --engineersmnky 你是對的,它可能會變得混亂。起初,我想存儲基於用戶的搜索,但在與可選的客戶覈對之後。你對抽象模型究竟意味着什麼?時態表? – mandulis 2014-10-06 21:32:16