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"} %>&nbsp;
  <%= link_to_remote '選択を解除', :url => {:action => "uncheck_all", :aim => "del"} %><br />
  当選:
  <%= link_to_remote 'すべて選択', :url => {:action => "check_all", :aim => "hit"} %>&nbsp;
  <%= 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] のいろいろな使われ方はこちらに載ってるみたいです

Adobe のヘルプサイト


いろいろ特別ルールがあるんだなあ