2012-06-03 45 views
0

我已經實現了一個簡單的搜索表單(根據「簡單表單」屏幕截圖),用於搜索我的數據庫中的「疾病」表。 現在我想要相同的搜索框來搜索「疾病」表和「症狀」表。ruby​​ on rails實現搜索多個關係的搜索表單

我的代碼目前看起來是這樣的:

main_page \ index.html.erb:

<b>Illnesses</b> 
    <%= form_tag illnesses_path, :method => 'get' do %> 
     <p> 
     <%= text_field_tag :search, params[:search] %><br/> 
     <%= submit_tag "Illnesses", :name => nil %><br/> 
     </p> 

illnesses_controller.rb:

class IllnessesController < ApplicationController 
    def index 
    @illnesses = Illness.search(params[:search]) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @illnesses } 
    end 
    ... 
end 

illness.rb:

class Illness < ActiveRecord::Base 
    ... 

    def self.search(search) 
    if search 
     find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
    else 
     find(:all) 
    end 
end 

可以y ou請指導我如何實現這個擴展? 我是一個初學者(顯然),我真的不知道應該是什麼「的form_tag」的行動,我應該在哪裏實現它和類實現擴展搜索...

感謝, 李

+0

你在使用Rails 2.x或3.x嗎?看起來像2.x,但如果你是新手,那麼你會希望從3.x開始 –

+0

其實我使用rails 3.2.3 ..我使用舊的語法嗎? – user429400

+0

是的,'find(:all)'是舊的。你想'where'語法。 –

回答

1

嗯,爲了簡單起見,假設你有一個類似於疾病類的症狀類(如果你將搜索功能重構爲一個模塊,然後將這個模塊包含在這兩個類中,它將是最乾淨的),那麼你可以做:

class IllnessesController < ApplicationController 
    def index 
    @results = Illness.search(params[:search]) + Symptom.search(params[:search]) 
    ... 
    end 
end 

但也許你想重構的名稱控制器,因爲現在它不再是特定疾病。另外請注意,我們在這裏使用兩個搜索查詢而不是一個,因此它不是最優的,但是可以節省您同時爲兩種類型的模型發送純SQL查詢的痛苦。

好的模塊。如果你對模塊不熟悉,他們可能看起來有點奇怪,但它們只不過是一段代碼,可以在類中共享,以保持DRY,這也是我們的情況。您可以想象將模塊包含爲從模塊中獲取代碼並在類的上下文中對其進行評估(由解釋型語言提供),其結果與將模塊代碼硬編碼到類本身中的結果相同。因此,模塊的樣子:

module Search 
    def self.search(token) 
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"]) 
    end 
end 

而現在任何類,如果它實現了find方法(ActiveRecord的API),可以愉快地包括該模塊並享受這樣的搜索功能:

require 'path/to/search' 

class Foo < ActiveRecord::Base 
    include Search 
end 

這就是它。現在如果你需要調整你的搜索代碼,你可以在一個地方改變它,並傳播給所有的包含者。您也可以在其內部有時會使用這樣的模塊創建模塊:

require 'active_support/concern' 

module Search 
    extend ActiveSupport::Concern 

    included do 
    #Stuff that gets done when the module is included (new validations, callbacks etc.) 
    end 

    module ClassMethods 
    #Here you define stuff without the self. prefix 
    end 

    module InstanceMethods 
    #Instance methods here 
    end 
end 

但是其中一些是在規定的ActiveSupport ::關注所以不是一切都將在純Ruby或許工作約定。我鼓勵你試驗這些東西,它們讓紅寶石變得真正有趣。哦,擴展非常像包含,只是,據我瞭解,它是在課堂上評估的。因此,如果您關注我,包含模塊的所有實例方法都將成爲包裝器模塊的類方法。玩的開心!

+0

謝謝。如果我想要爲您提供的乾淨解決方案,我的搜索模塊應該如何?你在兩個課程中包含什麼意思? (我只是在尋找高層次的解釋,這種語言與我所熟悉的任何東西都是如此不同......) – user429400

+0

給我一段時間。我將編輯我的文章,以便您可以在所有降價的地方看到它;-) – Renra