Ruby on Railsでデータベースに複数条件のあいまい検索をかける方法

このQ&Aのポイント
  • Ruby on Railsでデータベースにあいまい検索を複数条件でかけたい場合、どのようにすればよいのか教えてください。
  • 具体的な方法としては、条件を指定してデータベースのレコードを検索する際に、LIKE演算子を使用し、パラメータに入力された文字列を含むレコードを取得します。
  • また、複数の条件に対してあいまい検索をかける場合は、複数のLIKE演算子を使用し、条件を組み合わせます。条件を組み合わせる際には、AND演算子を使用することで、指定した全ての条件を満たすレコードを取得できます。
回答を見る
  • ベストアンサー

Ruby on Rails に関する質問です。

Ruby on Rails でデータベースにあいまい検索を複数条件でかけたいのですが、どのようにしたらよいのでしょうか?? def find   @bookinfo= Bookinfo.find(:all, :conditions => ["title like ?" => ["author like ?", "%#{params[:key]}%"]]) render :action => 'result.html.erb' end このような感じで複数のあいまい検索をかけたいのですがどのようにすればよいのか教えてください。 お願いします。SQLite3を使用しています。

  • Ruby
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

推測も若干混じりますがORを使えばいいだけみたいですね Bookinfo.where( " title like ? OR author like ? ", "%#{params[:key]}%", "%#{params[:key]}%" ) 結構簡単な話でしたが 回答遅れましてスイマセン

zerozero5320
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • rubyで単純なwebアプリに検索機能の追加をする場合

    ruby初心者です。 rubyで最も単純なwebアプリを作りながら勉強しています。 DBに数個のカラムを作り、登録、修正、削除、表示させるだけのものを作って勉強しているのですが・・・ 検索の機能を追加する場合、 scaffoldで作成したコントローラ(仮にxxxs)←最初に作ったモデルの複数形 xxxs_controller.rbに def search @xxx_pages, @ = paginate :xxxs, :per_page => 10, :conditions => ["★★★ LIKE ?", params[:xxx][:検索対象のカラム名] + '%' ] @keyword = params[:xxx][:検索対象のカラム名] render :action => 'list' end を加える事と、 _form.rhtmlに <%= start_form_tag :action => 'search' %> <!-- (1) --> <%= text_field :xxx, :検索対象のカラム名, :value => @keyword %> <%= submit_tag 'Search' %> <%= end_form_tag %> 付け加えるだけでよいのでしょうか??

  • Rails:findの条件指定(複数キーワード)

    RailsもMySQLも初心者です。 簡単な検索モデルを作っていますが、次のようなfindメソッドを使った検索の条件指定で、"name"の部分に複数の検索語句をor条件で指定することはできますか?  @users = User.find(:all, :conditions => ["family_name LIKE ?", name]) 検索対象は文字列です。 ("name1" or "name2")とか("name1" || "name2")などとやってみたのですが、最初の検索語句しか認知してくれないようです。 もしできるのでしたら、:conditionsの部分をどのように書いたらいいか教えてください。 Railsのバージョンは1.1.2です。 よろしくお願いします。 ※先ほど勘違いして同じ質問をいったん削除してしまいました。  もしご覧になっていた方がいらしたら申し訳ありません。

    • ベストアンサー
    • Ruby
  • Rails3でAjaxを使いたい

    どなたが知識をご教授下さい。 Rails3でAjaxのごく普通のハイパーリンクを作成したいのですが、うまくいきません。 /users/index.html.erb <div id="hoge"> <%= link_to "ajax",{:action => 'draw'},:remote => true %> </div> -- /users/_draw.html.erb ~いろいろ内容~ -- /users/draw.js.erb $('#hoge').html("<%= escape_javascript(render :partial => 'draw' )%>"); -- /users_controller.rb def draw ~いろいろ処理~ end -- ルーティング match 'users/draw' => 'users#draw' -- application.html.erb <%= javascript_include_tag :defaults %> -- gemfile gem 'jquery-rails' 以上のように処理するよう様々なサイトや書籍にはありましたが、「Templete Missing」のエラーが出てしまいます。かれこれ5時間以上ハマってまして、、、 どなたか知識をご教授頂けたら幸いです。 *メモ アクションdrawに渡ったときに、 「request.xhr?がfalse」ということは、ajax通信できていないということでしょうか???

    • ベストアンサー
    • Ruby
  • rubyにてデータが変更されているかチェックしたいのですが

    現在Ruby on Railsでプログラムを作成していますが、よくわかりません。周りに聞ける人もいないので、よろしければどなたか教えてください。 ユーザーファイルのパスワードが変更されていたら changepassdateの内容を変更して、 変更されていなかったらchangepassdateの内容はそのままにするという内容のプログラムを作りたいです。 現在の内容だと、パスワードを変更しないでもchangepassdateの内容が変わってしまいます。 どうしたらこの問題が解決されるでしょうか? お手数おかけして申し訳ありませんが、どなたか教えてください。お願いします。 def update @user = User.find(params[:id]) if @user.password =! params[:password] t = DateTime.now @user.changepassdate = t + 1 end respond_to do |format| if @user.update_attributes(params[:user]) flash[:notice] = 'ユーザー情報が更新されました。' format.html { redirect_to(@user) } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end

  • Rubyのパスワード変更画面について

    rubyでのプログラム作成についての質問です。 パスワードの変更画面を作成したいのですが、作り方がよくわかりません。 会社でrubyを使用したプログラム作成を命じられましたが、社内にrubyを使用できる人がいないので質問できず困っています。 パスワードを変更する際に、パスワードの入力と確認用パスワードの入力をして、 双方が一致したらパスワードを変更、双方が不一致ならエラーメッセージを表示するようにしたいのですが、どうしたらいいのでしょうか。 現在、コントローラ内は以下のようになっています。 def new @user = User.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @user } end end def create @user = User.new(params[:user]) if(params[:password]!=params[:password_confirm]) ←ここでパスワードと確認用パスワードをチェック? flash[:notice] = 'パスワードが間違っています。' redirect_to:back return end respond_to do |format| if @user.save flash[:notice] = 'User was successfully created.' format.html { redirect_to(@user) } format.xml { render :xml => @user, :status => :created, :location => @user } else format.html { render :action => "new" } format.xml { render :xml => @user.errors, :status => :unprocessable_entity } end end end パスワードチェックをしているつもりはあるのですが、パスワードと確認用パスワードが違っていても現在は登録処理がされてしまいます。どうしたらいいのでしょうか。 大変困っているのでどなたか教えてください。

  • ruby on railsにおけるモデルの関連付け

    ruby on rails のアソシエーションについて。 ruby on railsにおける、リレーショナルデータベースの作成についての質問です。 現在、 name,yomi,commentのカラムを持つnamesテーブル name1,name2,groupname,commentのカラムを持つgroupsテーブルをscaffoldにて作成しております。 この2つのテーブルを関連付けをしたいと考えています。 具体的には、 name1とname2を、それぞれnamesテーブルの中のnameを参照して使用したいと考えています。 各モデルのプログラムは以下のようになっています。 name.rb class Name < ActiveRecord::Base has_many :group attr_accessible :name :yomi :comment end group.rb class Group < ActiveRecord::Base attr_accessible :name1, :name2, :groupname, :comment end おそらく、groupテーブルに、name_idというカラムを追加し、nameテーブルにはhas_many :groups を追加する。といった形で良いかと考えていましたが、うまくいきません。 どのような形で実装すればよいか教えていただけないでしょうか。 また、もう1点、現在groupテーブルをweb上から登録する機能を作っています。 仕様としては、入力したname1,name2がすべてnamesテーブルのnameに含まれていれば、 name1,name2,groupname,commentすべてを登録、 いずれかあるいは両方が含まれていなければ、nameの登録画面へリンク、 となります。 現在実装中のプログラムのコントローラー部分(一部)は以下のようになります。 def create tag = params[:tag] @groups = Group.new もし、name1 name2 がnam2に含まれているならば、 @groups.name1 = tag[0] @groups.name2 = tag[1] @groups.groupname = tag[2] @groups.comment = tag[3] そうでなければ、 redirect_to name 登録画面 このような形で考えています。 こちらも、どのように実装すればよいか教えていただけないでしょうか? railsのバーションは3.1です。

  • Rails コンボボックスの値の保持について(select_tag,c

    Rails コンボボックスの値の保持について(select_tag,collection_select) こんにちは。 Ruby on Railsで簡単な一覧検索画面を作成中の者です。 検索時の検索条件にコンボボックスを使用しており、検索後にコンボボックスの値を保持したいのですが、どうしてもできません。 どなたかお分かりの方がおられましたらご教授いただけないでしょうか。 下記、作成中のソースです。 Viewの検索条件部 <%- form_tag({:action => "search"},{:method=> "GET"}) do -%> <th class="U" align="left" width="10%"><label for="userNm">ユーザー名</label></th> <td width="90%"><%= text_field_tag :userNm, @userNm %></td>  <th class="U" align="left" width="10%"><label for="authCd">社員権限</label></th> <td width="90%">  <%= collection_select(:auth, :authCd, Auth.find(:all, :order => "AUTH_CD"), :id, :AUTH_NM, :include_blank => true) %>  <td align="center"><%= submit_tag '検索' %></td> Controllerクラス: def search #画面パラメータから検索条件を作成 c = Condition.new # ユーザー名 userNm = "" if params[:userNm] userNm = params[:userNm] c.and "USER_NM", "LIKE", "%#{userNm}%" end # コンボボックスの値を取得 if params[:auth] && !params[:auth]["authCd"].blank? c.and "AUTH_CD", params[:auth]["authCd"] end # 検索処理 @users = User.paginate(:order => "USER_ID asc", :per_page => 5, :page => params[:page], :conditions => c.where) # 検索条件保持 @userNm = params[:userNm] # コンボボックスの値が保持できない if params[:auth] @auth_authCd = params[:auth]["authCd"] end respond_to do |format| format.html # index.html.erb format.xml { render :xml => @users } end end 見づらくて申し訳ありませんが、ざっと上記のようになっています。 もう1つの検索条件であるユーザー名(userNm)は保持できるのですが、コンボボックス(社員権限)の値が保持できません。 select_tagや、selectも使ってみたのですが、どちらも同じ結果でした。 コンボボックスの条件は、Authモデルから値を読込み、一番上は空白にする。というものです。 どのように記述すれば保持できるのか色々調べてみたのですが、結局分からず仕舞いでした。。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Ruby
  • Railsでのpaginateの方法

    Rails3.2.9でのpaginateがうまくいきません。 分かる方、御教示ください。 今のところ、下記の状態です。 (1)Ruby193/lib/ruby/gems/1.9.1/gemsの下に、mislav-will_paginate-2.3.11  をインストールした。 (2)Ruby193/rails/demand/Gemfileに gem 'mislav-will_paginate', '~> 2.3' を追加した。 (3)コマンドプロンプトで、>bundle installを実行 Using mislav-will_paginate (2.3.11)となっていることを確認 (4)app/controller/demandapps_controller.rb のdef indexの@demandapps = Demandapp.allを @demandapps = Demandapp.paginate(:page => params[:page], :per_page => 15) に変更 (5)app/views/demandappsのindex.html.erbの <table>~</table>の下に <%= will_paginate(@items) %> を追加。 この状態でWEBrickを動かすと、 NoMethodError in DemandappsController#index undefined method `paginate' for #<Class:0x3c0a218> app/controllers/demandapps_controller.rb:5:in `index' のエラーが出ます。paginateが認識されていないようなのですが、 この他にどこか設定しないといけない個所とかあるのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • railsで、データベースのfindの違いについて

    最近、仕事でRailsを使って仕事をしています。 そこで、疑問点が出てきたので、ちょっとお聞きしたいと思います。 Userというテーブルがあり、それを検索するとします。 User.find(:all, :conditions => '...', :order => '...') User.new.find(:all, :conditions => '...', :order => '...') どちらでも同じように検索できるのですが、これはプログラムの内部的にどういう違いがあるのでしょうか? ・上はActiveRecordを使って直接DBを読みに行っている。 ・下は一旦オブジェクトとして生成して、そこにActiveRecordでSQLを飛ばしてる。 そんな感じかと漠然と思ってますが、違うのでしょうか? パフォーマンス的なことも知りたいと思っています。 よろしくお願いします。

    • ベストアンサー
    • Ruby
  • rails3初心者 検索対象に別テーブルも含めたい

    ご教授よろしくお願いします。 <実装したい事> productテーブルからmakerテーブルのmaker_nameカラムも検索条件に含めたい。 (productテーブルの検索対象カラムは:codeとname ) (makerテーブルの検索対象カラムは:maker_name ) 以下のコードで試してみましたが、実装できません。 ========================= views ========================= <%=form_tag({:controller => :products,:action => :search}, :method => :get) do %> <%= text_field_tag "search_form",params[:search_form],:size =>25 %> <%= submit_tag '商品検索' %> <% end %> ======================================== products_controller.rb ======================================== def search @products =Product.find(:all, :include => :maker, :conditions =>['maker.maker_name like :value or code like :value or name like :value', {:value=> '%' +params[:search_form]+ '%'}]) end ======================================== リレーションシップ ======================================== product.rb belongs_to :maker **************************** maker.rb has_many :products **************************** どうぞよろしくお願い致します。

専門家に質問してみよう