Archive for the 'プログラミング' Category

19
3 月

Ruby on Railsはnamed_scopeでconditionsに命名できて便利すぎ。
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

calcsです。rails 2.0から導入されたらしいnamed_scopeは便利すぎる。

何かって言うとfind系のメソッドに渡す:conditionsパラメータを分割して、細切れになった条件節に命名できるというもの。
具体的な使い方は
[Rails]named_scopeすごすぎる
辺りを見てもらうとして。

何がうれしいって、RDBMSらしさがRoRでもっと発揮できるようになったってことです。RDBMSの根底にあるのは集合論。
AND条件は、各条件との積集合としてその結果を得ることができます。積とか和とかについては集合論か論理回路でも勉強してください。ま、とりあえずそういう集合論くささがO/Rマッパーでどーも脱臭されていたのですが、こいつは良い。

しかもチェインした条件もSQLの遅延評価によって無駄なく連結されて実行されるという。
というかこれがあったら
Ruby on Railsで高度なタグ管理を実現しよう(仮)
で書いたプラグイン化なんてほとんど要りませんな。ちょちょいと条件に命名してやれば話はほとんど終わっちまいます。

さぁnamed_scopeをつかって積集合を今すぐ作ろう!

補記:ただ一個不満なのはどーせだったら和差集合も上手い事扱えるようにしてほしかった。この辺を直感的に記述しようとすると演算子オーバーロードで条件節に対しての演算にメソッドオブジェクトを返すような設計にしないといかんのだろうか・・。いかん、C++で無駄設計していたブラックヒストリーがフラッシュバックする・・。良い方法知ってる人教えてください。

・・いやぁこのぶろぶもなんだか私信めいてきたなぁ。職権乱用かも。

14
3 月

Ruby on Railsで高度なタグ管理を実現しよう(仮)
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

どもども。calcsです。
最近なんだかRoRネタが多いですな、このブログ。いや、ぶろぶか。

まぁそれはそうとタグ。Web2.0とかいうBuzzWordがはやってからこちら、コンテンツのカテゴライズはディレクティブではなくタギングが主流になってきた感がございます。

で、RoRでタグをつけようと思うと真っ先に出てくるのがacts_as_taggable_on_steroids。
まぁ正直タギングぐらい自前で実装しても大した手間ではないんですが、どうせ誰が作っても似たようなデータ構造を採用することになるし、だったらacts_as_taggable_on_steroidsでもいいじゃない。みたいな話になるわけです。

ただしこいつは、タグ付けだけを扱っているので、タグにそれ以上の情報を与えられない。つまり、ニコニコ動画とかpixivとかであるような、投稿者タグのような「一般ユーザには編集出来ないタグ」を作ることができないのである。基本的に。

まぁそれじゃあ困ることもあるので、acts_as_taggable_on_steroidsが自動的に作ってくれるtaggingsテーブルに、user_idとかを保存するためのカラムを作ってしまえば大体ミッション完了である。

ruby script/generate migration AddUserIdToTagging user_id:integer
rake db:migrate

こんな感じで。ただこいつをやると、AddとかRemoveとかが一部そのまま使えなくなる(使えるのは使えるが、当然UserIdを加味した挙動ではないということ)。

そんなわけでその辺はフツーに
Tagging.find(:all,:conditions=>['taggable_type=? and user_id=?','data',params[:id]])
とかしてやらねばいかんわけです。
この辺をmoduleにまとめてしまって、tag_listにmixinしてしまえば完璧です。つーかそれってプラグインですが。

ただこの辺、権限の扱いがサイトによってビミョーに異なるので、一般的なプラグインとしてまとめにくいところ。うむむ。だれか汎用的なプラグインにしてー