ver.2橋本亮介の個人ブログ。rspecを実行した時のみ実行する方法コメントを残すことの発端はApartmentとsimplecov+guardの相性が悪いということでした。simplecovを使っていなかったのですが、お金関係の実装をしていてさすがにテストのカバレッジが気になったのでsimplecovを再度入れてみたところ、不可解な現象が生じました。一部のクラスだけカバレッジが反映されていない。本質的な理由はよくわからないのですが、どうやらApartmentのinitializerでexcluded_modelsを設定しているクラスに関してカバレッジが反映されないということがわかりました。githubでは同様の現象をApartmentの開発者に問い合わせている痕跡を見つけることができたものの、「なぜ?」という部分に関しては謎なままissueがcloseに。調べた結果、どうやらApartmentがinitializerですでにクラスをロードしていることが原因と考えられます。これはguardでspringを使ってrspecを走らせた場合に限ると。guardで走らせた場合は1.simplecovのスタート2.Apartment.initializer3.excluded_modelsのロードとなるわけです。simplecovはスタートした時点で監視を始めるので、その前にロードされたものに関しては無視するということではないか?というのが仮説ですが、真相はまだわかりません。最低限やりたいことの条件としては1.guardを使ってrspecを常に走らせることはしたい。2.guardを使ってrspecを走らせている時はいちいちカバレッジは更新されなくてもよい。rspecを実行した時のみcoverageを動かすことができる。‘wicked_pdf’をインストールしたのですが、うまく行かず。いうと公式では同時にwkhtmltopdf-binaryというgemをインストールする事で根本のライブラリであるwkhtmltopdfが入るのですが、このバージョンが低いのです。gemでいれると0.9系です(2014年10月1日現在)が最新では0.12系でした。Homebrewを使おうという事にはなるのですがこれも皆無。結局こちらの記事通りにやって解決しました。./build_osx.shこのコンパイルがすごく長いです。1時間くらいかかったかもしれません。installこれでインストール完了です。wkhtmltopdf/Users/username/.rvm/gems/ruby-2.1.3/bin/wkhtmltopdfあれ?まだgem見てるな。0.12.1を見るようになりました。下記のようなエラーがでました。controller=refinery/hogehoge/*調べてみるとzshが引っかかっている様子。zshの設定を.zshrcに下記の記述を加えて変更すればエラーがでなくなりました。installを実行したら上記のようなエラーがでました。agree」を実行しなかったこと。agreeしたらエラーがでなくなりました。Rails環境をOSXのローカル上に構築していたのですが、OSをアップデートしたらPostgreSQLが動かなくなりました。OSのアップデートが原因なのかは不明。下記の記事を参考にpostmaster.pidを削除して再起動したら動きました。私のマックには効果ありでした。プロフィール画像をアップロードしてDBに格納。アップロードで検索するとプラグインがいろいろとでてきます。CarrierWaveをつかってみました。結局使うのをやめました。CarrierWaveは優れたプラグインでした。実装は非常に簡単でした。画像をファイルでなくDBにバイナリとして保存することを決意。使用をやめ、独自に実装することにしました。versionという感じで、いくつかのサイズを選べるという機能は気に入っていたので、なるべく画像を使用している部分は変更のないような実装を目指しました。200pxのアバター画像を保存します。マイグレーションでカラムを追加。avatar_data16avatar_data32avatar_data64avatar_data200avatar_content_type:stringつぎに、routesを設定。:member次にcontrollerを設定。@person.avatar_content_type)end次はviewです。partialに関数を渡し、処理してもらう。コメントを残す繰り返しが必要な部分をpartialにしてしまいたくなるときがあると思います。partialをproducts分だけ読み込むので、処理が遅くなるときがあります。このようなループはpartialの中に入れてしまい、元の配列を渡すようにしています。%>こうすればpartialの中でループが行われるので、呼び出されるのは一度だけです。ところがこのループの中で、それぞれのproductに対し処理を入れたいときがあります。管理者用の製品一覧画面と、ユーザー用の製品一覧画面があったとします。管理者用の画面にはすべての製品を表示し、ユーザー用の製品一覧画面にはプロダクトオブジェクトに公開のフラグが立っているもののみを表示したいとします。※そもそもこの場合はコントローラー+モデルで配列自体を変更すると思いますが、あくまで例です。その場合、lambdaを利用してpartialに匿名関数を変数として渡す方法があります。%>この方法のメリットとしては、partial側を簡潔にすることができる点にあります。他にヘルパーを使うことが一般的だと思いますが、そうするとcase-when文が登場したりしてヘルパーが太っていきます。javascriptでよく関数を引数に渡すことがあると思いますが、それと似たような感じで使えるのでとても重宝しています。having節でエラーコメントを残すやりたかったのは人物の検索結果を出すことです。検索条件として、例えば男性で、東京在住であるというような、その人物の「属性」でand検索するというものになります。having節を使っていた部分が、postgresqlに変更してからエラーがでたということが発端になります。functionというエラーがでて、目的のことをやるには一旦select文を分割せねばならないようでした。SQLを直接書けばそれ自体は難しくないのですが、なんとかArelをできるだけ活用してできないものかと試行錯誤しました。ハードルはどのようにサブクエリをarelで組み立てるのかということ。この問題に関してはこちらの記事が参考になりました。クラスにたいしarel_tableメソッドでArel::Tableクラスのインスタンスを取り出します。※pattributes_peopleテーブルに対しPattributePersonクラスです。ような属性のIDが入った配列です。AND検索なのでinにしたいところですが、ここでは一旦in_anyで該当する行をすべて取り出しておきます。sub[:pattribute_id].in_any(pattributes)最後にサブクエリの本体となるArel::SelectManagerクラスのインスタンスを取り出します。#{pattributes.length}”)→pattribute_idがpattributeのリストに一致するものすべてを取り出しておいて、person_idが重複しないように圧縮します。そのときperson_idがpattributesの数分だけあるもののみ取り出しています。pattributeが全部該当した者=ANDと同じ。これを他のArel::Tableでくっつけてひとつの条件(Arel::Attributes::Attributeクラスのインスタンス)を作成します。person_table[:id].in(select_manager)あとはこのままpeopleとして取得するなり、他の条件と結合するなりできます。Person.includes(:user)@result.where(attr2)group節がサブクエリになったことでエラーは出なくなりました。作業中にノートPCの電源をうっかり電池切れさせてしまいました。電源をつないで再開してみるとWindowsが再起動状態に。やばいなー、と思いつつRubyMineを立ち上げると、3時間くらい作業したjsファイルが空に!落胆と焦りを落ち着かせ、なんとかなるはずだと言い聞かせていろいろ試したところ。ファイルを復元することができました。Historyこれで自動的に保存されていたファイルの履歴が出てきます。※たぶん初期設定でその量やタイミングが設定できるはず。履歴から壊れる前のものを選択してコピペ。railsserversimplecovSmartywordpress最近の投稿あーやっちまった。