2011年11月18日
[SQL]日付範囲同士の検索
日付範囲同士の検索というのは意外と落とし穴があります。
会議室予約や、機械や作業状況をある期間で集計したい場合等、しっかり考慮しないといけない。
例えば、ホテルの部屋管理を、以下のように部屋番号、チェックイン日、チェックアウト日というテーブルに管理していたとします。
テーブル:hoge
では、2011/11/14から2011/11/19に予約が入っている部屋を抽出したいと言った時に
と、安易にしては当然、ダメです。これでは1つめのデータしか取得出来ません。
この場合、以下のようなタイムラインを描くことが出来ます。
1,2,3,4のパターンは範囲内という扱いにする必要がある
結論から言うとSQLは以下の通りとなる
このSQLで希望通りの結果が表示されます。
2つ目の条件でID1,2がHit。
最後の条件ではID4がHit。
この条件をORで指定する事により、正しい検索が行われます。
タイムラインの図を見ながら、考えるとわかりやすいと思われます。
会議室予約や、機械や作業状況をある期間で集計したい場合等、しっかり考慮しないといけない。
例えば、ホテルの部屋管理を、以下のように部屋番号、チェックイン日、チェックアウト日というテーブルに管理していたとします。
テーブル:hoge
| ID | from_date | to_date |
|---|---|---|
| 1 | 2011/11/15 | 2011/11/17 |
| 2 | 2011/11/10 | 2011/11/14 |
| 3 | 2011/11/19 | 2011/11/23 |
| 4 | 2011/11/10 | 2011/11/23 |
| 5 | 2011/11/10 | 2011/11/12 |
| 6 | 2011/11/21 | 2011/11/23 |
では、2011/11/14から2011/11/19に予約が入っている部屋を抽出したいと言った時に
SELECT * FROM hoge WHERE from_date >= '2011/11/14' AND to_date <= '2011/11/19'
と、安易にしては当然、ダメです。これでは1つめのデータしか取得出来ません。
この場合、以下のようなタイムラインを描くことが出来ます。
1,2,3,4のパターンは範囲内という扱いにする必要がある
結論から言うとSQLは以下の通りとなる
SELECT *
FROM hoge
WHERE ('2011/11/14' <= from_date AND from_date <= '2011/11/19')
OR ('2011/11/14' <= to_date AND to_date <= '2011/11/19')
OR ('2011/11/14' >= from_date AND '2011/11/19' <= to_date)
このSQLで希望通りの結果が表示されます。
WHERE ('2011/11/14' <= from_date AND from_date <= '2011/11/19')
この条件でID1,3がHitする。
('2011/11/14' <= to_date AND to_date <= '2011/11/19')
2つ目の条件でID1,2がHit。
('2011/11/14' >= from_date AND '2011/11/19' <= to_date)
最後の条件ではID4がHit。
この条件をORで指定する事により、正しい検索が行われます。
タイムラインの図を見ながら、考えるとわかりやすいと思われます。
タグ :SQL
2011年11月16日
[Rails]will_paginate 検索条件を指定する画面から生成する場合
will_paginateを利用すると、1ページあたりに表示するデータ件数を制限出来き、次ページや1.2.3.等のページリンクも簡単に作成出来る。
しかし、検索条件を指定するページから新たに表示する場合にはparamの値に気をつける必要がある。
例:search → index という画面遷移を前提。searchは検索条件、indexは結果を表示。paginateはindexにて行う。
hoges_controller.erb
def result
staffwhere.and('code = ?',"#{params[:code]}")
@hoge = Hoge.paginate(:page => params[:page],:conditions=>where,:per_page => 20)
render :action => 'index'
end
index.html.erb
<%= will_paginate @hoges, :previous_label => '«前', :next_label => '次»' %>
こんな感じにすると、indexのページには前へ1,2,3,4...次へというリンクが付くが、リンクの項目がpage=1とかpage=3とかページ番号が付く。
実際に次へや2をクリックしてページを切り替えると、検索条件が無しの状態で全件表示になってしまう。
検索条件をコントローラーで使いまわすように index.html.erb
<% pm={:code => params[:code]} %>
<table>
(省略)
</table>
<%= will_paginate @hoges, :previous_label => '«前', :next_label => '次»', :params => pm %>
というように、paramsの値を追加する必要がある。これで、ページを切り替えても検索条件は保持される。
2011年11月14日
[Rails]ActiveScaffoldでRestfulしている場合のroutes.rbの設定
とあるシステムにて明らかにActiveScaffoldで作成された画面の動きがおかしかった。
次へやページを変えると

こんな感じでActiveRecord :: Record Not Found なんたらってエラーが発生。
Restfulの場合、routes.rbは以下の設定が必要
という事でroutes.rbを確認。
となっていたので
に変更。ちなみにhogesではなくhoge(単数形)。
ルーティングを変更して、再度、次へをクリックしたところ、正常に次ページが表示されました(^^)
根深い問題ではなくて良かった。
次へやページを変えると
こんな感じでActiveRecord :: Record Not Found なんたらってエラーが発生。
Restfulの場合、routes.rbは以下の設定が必要
map.resources :hoge, :active_scaffold => true'
という事でroutes.rbを確認。
map.resources :hoges
となっていたので
map.resources :hoge, :active_scaffold => true'
に変更。ちなみにhogesではなくhoge(単数形)。
ルーティングを変更して、再度、次へをクリックしたところ、正常に次ページが表示されました(^^)
根深い問題ではなくて良かった。
2011年11月14日
hamazoでSyntaxHighlighter3を利用
このBLOGに技術的な備忘録を書いていく事を考えています。
その際に、ソースコードを貼り付ける必要が出てきますが、どうせなら綺麗に貼りつけたい!
という事でhamazoでSyntaxHighlighterを利用出来るようにしてみました
これでhamazoでもこのように綺麗にソースコードが表示出来ます!
これで備忘録も見やすくなります。
という事でhamazoでSyntaxHighlighterを使用する方法を記載します。
注意:この設定を行うと、BLOGの記事は自動で改行されなくなります。明示的にbrタグで改行する必要があります。
注意2:hamazo単体では利用出来ません。hamazo以外にファイルをアップロード&アクセスがする事が出来るサーバーが必要です。
1.SyntaxHighlighter本体をダウンロード
2.ダウンロードしたファイルを解凍。testsフォルダ以外をアクセス可能なサーバーへアップロードします。
3.管理画面の左のメニューから「ブログの設定」→「テンプレート」を選択
使用中のテンプレートの「カスタマイズ」を選択
4.トップページ、個別記事、アーカイブを以下のように追記します。
その際に、ソースコードを貼り付ける必要が出てきますが、どうせなら綺麗に貼りつけたい!
という事でhamazoでSyntaxHighlighterを利用出来るようにしてみました
これでhamazoでもこのように綺麗にソースコードが表示出来ます!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>テスト</title>
これで備忘録も見やすくなります。
という事でhamazoでSyntaxHighlighterを使用する方法を記載します。
注意:この設定を行うと、BLOGの記事は自動で改行されなくなります。明示的にbrタグで改行する必要があります。
注意2:hamazo単体では利用出来ません。hamazo以外にファイルをアップロード&アクセスがする事が出来るサーバーが必要です。
1.SyntaxHighlighter本体をダウンロード
2.ダウンロードしたファイルを解凍。testsフォルダ以外をアクセス可能なサーバーへアップロードします。
3.管理画面の左のメニューから「ブログの設定」→「テンプレート」を選択
使用中のテンプレートの「カスタマイズ」を選択
4.トップページ、個別記事、アーカイブを以下のように追記します。


