5

ユーザーがデータベースを検索できるようにするアプリケーションを作成しようとしています。検索ページのレイアウトは、検索を絞り込むためにデータベースにすでに存在するデータを表示するいくつかのドロップダウンメニューと、ユーザーが「プロジェクト名」などのキーワードを入力できるようにするテキストボックスで動作します。検索フォームに入力されたすべての情報をレールに取得して、1つの大きな検索を実行するのに問題があります。

これが私の検索レイアウトの一部です:

<%= form_tag search_path, :method => 'get' do %>

<%= hidden_field_tag :direction, params[:direction] %>
 <%= hidden_field_tag :sort, params[:sort] %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search Project Name", :project_name => nil %>
</p>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search Client", :client => nil %>
</p>
<% end %> 

プロジェクトコントローラでのインデックスと検索アクションは次のとおりです。

def index
@projects = Project.all

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

def search

@project_search = Project.search(params[:search]).order(sort_column + ' ' + sort_direction).paginate(:per_page => 5, :page => params[:page])


end

これが私のmodels/project.rbファイルの一部です

def self.search(search)
if search
  where('project_name LIKE ?', "%#{search}%") || where('client LIKE ?', "%#{search}%")
else
  scoped
end
end

ご覧のとおり、私はproject_nameまたはクライアントのいずれかを検索しようとしています。これがうまくいけば、他の分野にも広げていきます。

現時点での機能は、両方のボックスを検索しようとすると、1つが上書きされ、フィールド検索の1つだけが実行されることです。

私はRORを初めて使用するので、誰かが助けてくれることを願っています。任意の提案をいただければ幸いです。

前もって感謝します!

4

2 に答える 2

4

この問題は別の質問で解決されました:Ruby on Rails:高度な検索

あなたの質問に基づいて、@ Chris Wiseは、projectsテーブルに2つの列があると想定しています:project_nameclient

私は間違っているかもしれませんが、実際には2つのモデルがClientありProject、クライアントには多くのプロジェクトがあります。その場合、各モデルで検索を定義する必要があります。

クライアントモデル:

def self.search search_term
  return scoped unless search_term.present? 
  where(['client_name LIKE ?', "%#{search_term}%"]) #client_name means the column name, change it to the correct name.
end

プロジェクトモデル:

def self.search search_term
  return scoped unless search_term.present? 
  where(['project_name LIKE ?', "%#{search_term}%"]) #project_name means the column name, change it to the correct name.
end

あなたのフォーム:

<%= form_tag projects_path, method: :get do %>
  <%= text_field_tag :project_name, params[:project_name] %>
  <%= text_field_tag :client, params[:client] %>
  <%= submit_tag "Search", name: nil %>
<% end %>

次に、コントローラー:

#return all projects that match the search criteria
@project_search = Project.search(params[:project_name]).all
#return all clients that match the search criteria
@clients_search = Client.search(params[:client]).all

お役に立てば幸いです...

于 2012-07-23T13:49:04.953 に答える
4

私はあなたがしたいと思うかもしれないいくつかのことを提案したいと思います。まず、コントローラーにインデックスメソッドに加えて検索メソッドを設定する必要はありません。どちらもプロジェクトのコレクションをレンダリングしているためです。

それで、最初に、私は変更します:

<%= form_tag search_path, :method => 'get' do %>

<%= form_tag projects_path, :method => 'get' do %>

これにより、代わりにindexメソッドが呼び出されます。

次に、検索ロジック自体をモデルに組み込むことをお勧めします。

Projectクラスに、次のメソッドを追加します。

def self.search search_term
  return scoped unless search_term.present?
  where(['project_name LIKE ? OR client LIKE ?', "%#{search_term}%", "%#{search_term}%"])
end

最後に、インデックスのコントローラーアクションを次のように変更します。

@projects = Project.search(params[:search]).all

事実上、あなたがしていることは、用語が存在する場合にのみ検索し、そうでなければスコープを連鎖させることです。

于 2012-07-20T11:26:50.293 に答える