• 締切済み

rails3で複数条件から検索して表示、送信

はじめましてrails初心者です。 皆さまの知恵をご拝借できればと思います。 以下やりたいこと、プログラム含め考え方をご教授いただければと思います。 尚、環境はails3.0.5です。 ----やりたいこと------------------------------------- ・留学エージェント検索サイト: ・参照サイトURL:http://www.ryugaku-seikatsu.net/Agent/AgentSearchShow/ ※行きたい国や目的を選んでそれに対応する留学エージェント会社を検索して、表示する。 --------------------------------------------------- ------考え方--------------------------------------- ※上記サイトを参考にお願いします。 ◆table構成 ・companies(name,email) ・countries ・purposes ・prefectures テーブル、countries、purposes、prefecturesに一致するcompanyを検索して、表示したく テーブルsearchesを作ろうとしています。 searchesテーブル company_id country_id purpose_id prefecturer_id そもそもこのテーブル設計で合っているのかがわかりません。country_id、purpose_id、prefecturer_id をcompany_idに紐付けしたくて上記のような構成になりました。 もっと効率のよいテーブル設計があればご教授ください。 そして、searchesテーブルを各テーブルにbelongs_toでアソシエーションさせて 検索しようと考えていますが、何か腑に落ちません。 また、searchesにidをつけたままの方のがよいのか、外した方がよいのかわかりません。 一応やってみたこととして searchコントローラーを作ってみました。 def search  @searches = Search.where(:country_id => params[:country_id]).where(:puropose_id =>  params[:purpose_id]).where(:prefecture_id => params[:prefecture_id]) end view(検索結果) <% @searches.companies.each do |company| %> <li><%= company.name %></li> <% end %> 上記を実行するとエラーでcompaniesが定義されていないとでてきます。 これもなぜだか、よくわりません。 ---------------------------------------------------------- ------その他わからないこと-------------------------------- 上記サイトを検索して進んでいくと、フォームを入力してフォームデータを送信します。 その際、情報送信先がユーザー、自分、companyだとします。 ユーザー、自分は問題なくできるのですが、検索結果にマッチしたcompany にフォームデータを送信する際に、どのように送信したらよいのかがわかりません。 一応、comapaniesテーブルにemailを入れているのですが、どのように紐付けしてよいの かがわかりません。 ---------------------------------------------------------- これまで、本やサイトで勉強していたのですが、自分のやりたいことに マッチしている情報が見つからなくて、困っています。 基本はRuby on Rails 3 アプリケーションプログラミング (著者 山田 祥寛 ) で勉強しておりますが、まだまだ勉強不足です。 http://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3% … まだまだかなりの初心者ですが、何卒宜しくお願い申し上げます。

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

まず情報源ですが 山田祥寛「Ruby on Rails 3ポケットリファレンス」と Rails Guides http://guides.rubyonrails.org/ を主に利用しています。後者は結構詳しいので特に便利です。 さてcontrollerですが、 Companyからはhas_many、Prefectureからはbelongs_toで参照されているとすると Prefecture.where(:name=>"Osaka").collect{|a| a.company} でOsakaに関するcompanyの情報が得られ、同じようにCountryがあるとすると Country.where(:name=>"USA").collect{|a| a.company} でこれらの配列のandをとれば良いわけです。 もしかしたら、 company_idで ids=Prefecture.where(:name=>"Osaka").collect{|a| a.company_id} & Country.where(:name=>"USA").collect{|a| a.company_id} Company.find(ids) の方が良いかもしれません。 (以上のコードは動作確認はしていません) また、CompanyからPrefectureやCountry直接ではなく中間テーブルを介してやる方法もありますので、上のサイトなどを参考にしてください。 それとcontrollerへのアクセスはルーティングで思わぬactionを使っていることがありますのでそれも注意してください。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

まずはtableについて companiesと残りの3つのテーブルを関連を記録しておくのがsearchesテーブルだけということでしょうか。 例えば A社がB県とC県に関係していて、purposeがE,F,Gの3つがある場合には、どのようなsearchesテーブルになるのでしょうか。 purposeが3つなので、3つのレコードができ、prefectureは適当に割り振ると1つ余ってしまします。 それよりも、 companiesとprefecturesを1対多 companiesとpurposesを1対多 (countryのなかのprefectureとすれば)prefecturesとcountriesを多対1 のように関連づけるのはどうですか。

04106972
質問者

補足

ご回答ありがとうございます。 searchesテーブルはデータの記録ではなく、そのテーブルを基に検索はできないのかと考えて作ってみました。普通はどうするのかがわからず、こうしてみました。やはり効率がわるいのでしょうか? 回答いただきましたsearchesテーブルの構造ですが、以下となります。 (A社:id 1, B県,C県:id 2,3 E,F,G:id 4,5,6とします) | company_id | prefecture_id | purpose_id ---------------------------------------- | 1 | 2 | 4 | 1 | 2 | 5 | 1 | 2 | 6 | 1 | 3 | 4 | 1 | 3 | 5 | 1 | 3 | 6 ※スペースがなくなってしまい、レイアウトが崩れてしまっております。 今、自分自身で書いていて思うのですが、上記テーブルを手動で作ろうとしているので、途方もない作業だと思い、間違っている予感がします。 仮に、A社が全国に対応していて、留学目的が10個に対応していて、留学対応可能な国が9カ国の場合 47×10×9=4230通りも作らければならず、ありえないと思いますが、 では、具体的にどうしたらよいのかそこがわからない次第です。 また、ご回答いただきましたように >companiesとprefecturesを1対多 >companiesとpurposesを1対多 >(countryのなかのprefectureとすれば)prefecturesとcountriesを多対1 >のように関連づけるのはどうですか。 上記のように設定した場合、modelはわかるのですが、controllerにどのような記述をすれば、複数の条件からcompanyに紐づいた検索ができるのでしょうか?大変申し訳ありませんが、サンプルを頂けますと幸いです。何卒宜しくお願いします。 また、自分がやりたいことを書く際にどのように探していらっしゃいますか? 例えば、上記のような検索を行いたいときにgoogleで調べたりしましても、有効な情報は少なく、また古い情報であったりします。書籍も基本的なことしか書いていないので、複雑になってくると対応の仕方がわからないのです。 githubでもどのように探してよいのか分からず、活用できておりません。 ちなみにgithubで公開されているコードだけ見ても、実際のサイトをみないとイメージできないのですが、その場合はダウンロードするのでしょうか? 初心者発言で大変申し訳ございません。