find の :select オプション
最近、find するときに :select をつけるのがちょっと好きです
:joins 使うときには (テーブル名).* でよく使うけれど
カラム指定で取ってくるのが最近の好みです
users = User.find(:all, :select => "users.id")
みたいに指定して、id だけ引っ張ってきたりする
引っ張ってきてくれた id は
users.each do |user| p user.id end
と、取り出し方は :select なしのときとおんなしです
明らかにこのカラムしか使わないってのが分かってるときは、
:select つけてあげたほうが、きっと DB にもやさしい
eco?
久しぶりで動かなかった mysql5 と MacPort
久しぶりに mysql5 を動かそうと思ったら
昔のへんてこな設定のせいだか何だかで上手く動かなくなってたので
いっそのこと入れ直してみることにした
$ port list | grep mysql $ port installed | grep mysql5
port と local に存在確認後、アンインストール
$ sudo port uninstall mysql5 $ sudo port clean --all mysql5
server 指定してインストール
$ sudo port install mysql5 +server
そしたら怒られた。。
Error: Target org.macports.fetch returned: fetch failed Error: Status 1 encountered during processing.
fetch て!
そんなこと言われても。。
でもそういえば port 使うのも久しぶりだしなあと思って
とりあえずソフトウェア更新してみる
$ sudo port -d sync
そんで再度インストールしてみたら無事入った
ほっ
よし、起動してみる
まず初期化
$ sudo -u mysql mysql_install_db5
my.cnf をコピーするらしい
$ sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /opt/local/etc/mysql5/my.cnf
my.cnf の mysqld にとりあえず default-character-set だけ追記
$ sudo vi /opt/local/etc/mysql5/my.cnf [mysqld] default-character-set = utf8
おもむろに起動
$ sudo /opt/local/lib/mysql5/bin/mysqld_safe &
これ、sudo でやらないと
error: 'Can't connect to local MySQL server through socket '/opt/local/var/run/mysql5/mysqld.sock' (2)'
って出ちゃうみたい
気をつけて!
root のパスワードは設定してないので、とりあえず以下で接続が確認できそう
$ mysqlshow5 -u root
あとは自動起動を設定しておくといいらしい
$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
checkbox を一括選択させる link_to_remote
チェックボックスを一括選択させたり、一括解除させたりするリンクを作成してみました。
ちなみに、
<table> <tr> <td> <%= check_box_tag "del_ids[]", user.id %> </td> <td> <%= check_box_tag "hit_ids[]", user.id %> </td>
こんなかんじに各用途でチェックボックスがあるとき用
view 側
<div> 削除: <%= link_to_remote 'すべて選択', :url => {:action => "check_all", :aim => "del"} %> <%= link_to_remote '選択を解除', :url => {:action => "uncheck_all", :aim => "del"} %><br /> 当選: <%= link_to_remote 'すべて選択', :url => {:action => "check_all", :aim => "hit"} %> <%= link_to_remote '選択を解除', :url => {:action => "uncheck_all", :aim => "hit"} %> </div>
controller 側
# すべて選択 def check_all render :update do |p| p << <<-END boxes = document.getElementsByName('#{params[:aim]}_ids[]'); for(i = 0; i < boxes.length; i++){ boxes[i].checked = true; } END end end # 選択を解除 def uncheck_all render :update do |p| p << <<-END boxes = document.getElementsByName('#{params[:aim]}_ids[]'); for(i = 0; i < boxes.length; i++){ boxes[i].checked = false; } END end end
やっぱり Ajax は便利なんだろうなあ
Array の all メソッド
よく参考にしているこのサイトにはなかったようなので。。
http://www.ruby-lang.org/ja/man/html/Array.html
Array に対して、each とか頻繁に使うわたしですが
all ってやつもあって、これがまた便利である
たとえば、validation 使えないときのパラメータチェックとか
if params[:name] && params[:birthday] && params[:email] end
こんなふうに書かなくちゃいけないところを
if [:name, :birthday, :email].all?{|key| params[key]} end
便利!
navigateToURL の罠
Flex 3 の navigateToURL で POST リクエストを飛ばそうとしたところ
なぜか GET でしか飛ばないという罠に陥りました
以下、コードを抜粋
private function onItemClick(ev:ItemClickEvent):void { var request:URLRequest = new URLRequest( ( ev.item as IItem ).link ); request.method = URLRequestMethod.POST; navigateToURL(request); }
アイテムのリンクを押下したときに発生するイベントとして使ってます
これで method に POST 指定でリクエスト送信しても、
なぜか GET にしかならないんだな。。
しかしここで data に何か適当な値を入れてあげると、
たちまち POST として動き出すという罠・・・!
private function onItemClick(ev:ItemClickEvent):void { var request:URLRequest = new URLRequest( ( ev.item as IItem ).link ); request.dada = "dummy"; request.method = URLRequestMethod.POST; navigateToURL(request); }
みなさんも気をつけてくださいな
Bindable をつけてみる
SWFLoader の source の値に、
xml から動的に取得してきた値を代入しようとしたときに
データバインディングでは"swfUrl"への代入を検出できません。
と怒られてしまいました
ちなみにコードは以下のようなかんじ
(便宜上必要最小限にまとめ、xml ロード部分も省略してダミーの URL 直書きにしてあります。。)
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script > <![CDATA[ private var swfUrl:String = "http://testurl.jp/test.swf"; ]]> </mx:Script> <mx:SWFLoader id="Test" autoLoad="true" source="{swfUrl}"/> </mx:Application>
どうやら、Flex 3 の世界では
データが変更されるとそれに応じてユーザインタフェースが変更されるようなデータバインディングが行われる際は、
それを実現する変数の宣言の前に [Bindable] をつけてあげなくてはいけないらしかったです
修正後が以下のコード
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script > <![CDATA[ [Bindable] private var swfUrl:String = "http://testurl.jp/test.swf"; ]]> </mx:Script> <mx:SWFLoader id="Test" autoLoad="true" source="{swfUrl}"/> </mx:Application>
これで警告は出なくなりました
ちなみに、[Bindable] のいろいろな使われ方はこちらに載ってるみたいです
いろいろ特別ルールがあるんだなあ