Railsのfindで複数のテーブルから検索する:includeでeager loading
Ruby on Rails でデータベースから検索を行う場合、通常は Model.find メソッドを使いますが、複数のテーブルを組み合わせて検索する方法をメモしておきます。
今回考えるのは、people(人)と entries(ブログの記事)という2つのテーブルがあり、people テーブルの要素 age(年齢)と entries テーブルの要素 created_at(投稿日時)の2条件で絞るという場合です。例えば「現時点で20歳未満の未成年が2010年4月1日以降に投稿したブログ記事を検索する」みたいな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # people entries +----+-----+ +----+-----------+---------------------+ | id | age | | id | person_id | created_at | +----+-----+ +----+-----------+---------------------+ | 1 | 24 | | 1 | 1 | 2010-07-01 10:11:12 | | 2 | 18 | | 2 | 2 | 2010-01-01 10:11:12 | | 3 | 48 | | 3 | 3 | 2010-09-01 10:11:12 | | 4 | 17 | | 4 | 4 | 2010-06-01 10:11:12 | | 5 | 20 | | 5 | 5 | 2010-03-01 10:11:12 | | 6 | 23 | | 6 | 6 | 2010-08-01 10:11:12 | | 7 | 19 | | 7 | 7 | 2010-09-01 10:11:12 | | 8 | 29 | | 8 | 8 | 2010-02-01 10:11:12 | | 9 | 31 | | 9 | 9 | 2010-04-01 10:11:12 | | 10 | 22 | | 10 | 10 | 2010-05-01 10:11:12 | +----+-----+ +----+-----------+---------------------+ # a person has many entries |
本物のアウトプットはこんな風にはなりませんがご愛嬌ということでご勘弁を。
……続きを読む »
Ruby1.8.7以降ではtruncateメソッドの仕様が変わったらしくエラーが起きる
『基礎Ruby on Rails』を手にウェブアプリケーション "Morning Glory" を作成していたわけですが、第6章のデータを MySQL にインポートしたら以下のようなエラーが生じてしまいました。
1 2 | NoMethodError in Main#index undefined method `length' for #<enumerable::enumerator:0xb676c440></enumerable::enumerator:0xb676c440> |
問題の「Main#index」ってのは以下の RHTML ファイルです。どうやらこれの8行目にある truncate メソッドが引っかかっているご様子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | < % @side_bar_template_name = 'side_bar' -%> <div id="whats_new"> <h2>What's New</h2> <ul> < % @new_articles.each do |a| -%> <li>< %= link_to h(a.heading), :action => a.place, :anchor => "article_#{a.id}" %> < %= truncate(h(a.body), 20) %></li> < % end -%> </ul> </div> <div id="main"> < % @top_articles.each do |a| %> <h2>< %= h(a.heading) %></h2> < %= simple_format(h(a.body)) %> < % end -%> </div> |
結論から言うと、これは Ruby のバージョンというか仕様に対してもともとのコードが噛み合ってないのが原因のようです。解決策は以下のとおり。
……続きを読む »
Railsで次のエラーへの対処法:We’re sorry, but something went wrong.
Ruby on Rails で楽しくウェブアプリを作ろうとコントローラを以下のように作成して http://localhost:3000/main/index/ にアクセスを試みたのですが、エラーに遭遇したのでその対処法メモです。
1 | ruby script\generate controller main |
アクセスすると、まだビューを作成していないので本来なら「Template is missing」と表示されるはずなのに、表示されるのは以下のメッセージ。「something went wrong」と言われても困ります。僕のほうこそそこを知りたいw
We’re sorry, but something went wrong.
We’ve been notified about this issue and we’ll take a look at it shortly.
RailsのWEBrickサーバを強制的に停止する方法
Ruby on Rails で WEBrick サーバを起動したはいいものの停止できなくなってしまった場合の対処法です。
……続きを読む »
![[画像] 今日の気になる記事「きにきじ」QR Code](http://www.kagitaku.com/diary/images/qrcode.png)
![[画像] きにきじ Feed](http://www.kagitaku.com/diary/images/Newspaper_Feed_128x128_ie6.png)
![[画像] kagitaku.com ロゴ](http://www.kagitaku.com/common/images/logo.png)





![[画像] 最上部へ](http://www.kagitaku.com/common/images/pageNavi-toTop.png)
![[画像] 最下部へ](http://www.kagitaku.com/common/images/pageNavi-toBottom.png)
![[画像] 履歴を戻る](http://www.kagitaku.com/common/images/pageNavi-back.png)
![[画像] 履歴を進む](http://www.kagitaku.com/common/images/pageNavi-forward.png)
![[画像] Contact](http://www.kagitaku.com/common/images/pageNavi-contact.png)
![[画像] Sitemap](http://www.kagitaku.com/common/images/pageNavi-sitemap.png)