<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel rdf:about="https://whtiecrow.blog.shinobi.jp/RSS/100/">
    <title>白い烏</title>
    <link>https://whtiecrow.blog.shinobi.jp/</link>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="https://whtiecrow.blog.shinobi.jp/RSS/" />
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
    <description>ブログツール、2007/11/06作成</description>
    <dc:language>ja</dc:language>
    <dc:date>2013-10-06T14:06:20+09:00</dc:date>
    <items>
    <rdf:Seq>
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%80%81%E4%BF%9D%E5%AD%98%E3%81%AE%E4%BC%9D%E6%92%AD%E9%96%A2%E4%BF%82%E3%81%8C%E3%82%8F" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/xcode/xcode%E3%81%AEgit%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/date_select%E3%81%AE%E5%88%9D%E6%9C%9F%E5%80%A4%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AE%E3%83%8F%E3%83%9E%E3%82%8A" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/rails2.3%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8B" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/activerecord--base.destory%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%A7%E9%96%A2%E9%80%A3%E5%85%88%E3%81%8C%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/activerecord%E3%81%A7in%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%83%BB%E3%83%BB%E3%83%BB" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/%E3%81%9D%E3%81%AE%E4%BB%96/radrails%E3%81%AE-identical%20code%20structure%E3%80%80%EF%BD%9E-%E3%83%AF%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%81%AE%E6%B3%A8%E6%84%8F" />
      <rdf:li rdf:resource="https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E5%B0%8E%E5%85%A5" />
    </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%80%81%E4%BF%9D%E5%AD%98%E3%81%AE%E4%BC%9D%E6%92%AD%E9%96%A2%E4%BF%82%E3%81%8C%E3%82%8F">
    <link>https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%80%81%E4%BF%9D%E5%AD%98%E3%81%AE%E4%BC%9D%E6%92%AD%E9%96%A2%E4%BF%82%E3%81%8C%E3%82%8F</link>
    <title>ActiveRecordの関連で、保存の伝播関係がわからなくなったので整理</title>
    <description>久しぶりにRailsに戻ってきたら、あまりにもバージョンが違いすぎてて、なんか浦島太郎気分。

で、ActiveRecordで関連を持ったときに、保存の伝播の仕方が混乱してきたので整理してみた。

結論を先に言うと、
親のメソッドで代入したときはsaveの伝播はなされるが、子のメソッドから代入したと...</description>
    <content:encoded><![CDATA[久しぶりにRailsに戻ってきたら、あまりにもバージョンが違いすぎてて、なんか浦島太郎気分。<br />
<br />
で、ActiveRecordで関連を持ったときに、保存の伝播の仕方が混乱してきたので整理してみた。<br />
<br />
結論を先に言うと、<br />
親のメソッドで代入したときはsaveの伝播はなされるが、子のメソッドから代入したときはsaveの伝播はなされない。<br />
つまり、has_many, has_oneとbelongs_toは独立して動作する、ということ。<br />
<br />
ふむ。シンプル。<br />
<br />
試しにプロジェクト作ってみて、動かして確認。<br />

<pre>HogeParent
has_many :hoge_children<br />
has_one :hoge_has_one<br />
<br />
HogeChildren<br />
belongs_to :hoge_parent<br />
<br />
HogeHasOne<br />
belongs_to :hoge_parent<br />
<br />
</pre>
親は未保存<br />

<pre>hoge_parent = HogeParent.new
hoge_parent.name = "post_save hoge"
hoge_parent.new_record? = true
hoge_child = HogeChild.new
hoge_child.name = "post_save child"
hoge_child.new_record? = true
hoge_has_one = HogeHasOne.new
hoge_has_one.name = "post_save has_one"
hoge_has_one.new_record? -&gt; true
</pre>
親が未保存の時、親のメソッドで代入する<br />

<pre>hoge_parent.hoge_children &lt;&lt; hoge_child
hoge_child.hoge_parent_id -&gt; nil
hoge_child.new_record? -&gt; true
hoge_parent.hoge_has_one = hoge_has_one
hoge_has_one.hoge_parent_id -&gt; nil
hoge_has_one.new_record? -&gt; true
</pre>
当然のことながら、この時点では何も起こらない<br />
<br />
親が未保存の時に親のメソッドで代入したもので、親を保存したとき<br />

<pre>hoge_parent.save
hoge_parent.new_record? -&gt; false
hoge_child.new_record? -&gt; false
hoge_child.hoge_parent_id -&gt; 10
hoge_has_one.new_record? -&gt; false
hoge_has_one.hoge_parent_id -&gt; 10
</pre>
親の保存が伝播して、子のhoge_prent_idに自動的にIDが保存され、子も一緒にsaveされる<br />
<br />
親を先に保存する<br />

<pre>saved_hoge_parent = HogeParent.new
saved_hoge_parent.name = "pre_save hoge"
saved_hoge_parent.save -&gt; true
saved_hoge_parent.new_record? -&gt; false
saved_hoge_parent.id -&gt; 11 
saved_hoge_parent.new_record? = false
saved_hoge_child = HogeChild.new
saved_hoge_child.name = "pre_save child"
saved_hoge_child.new_record? = true
saved_hoge_has_one = HogeHasOne.new
saved_hoge_has_one.name = "pre_save has_one"
saved_hoge_has_one.new_record? -&gt; true
</pre>
親を先に保存して、親のメソッドで代入<br />

<pre>saved_hoge_parent.hoge_children &lt;&lt; saved_hoge_child
saved_hoge_child.new_record? -&gt; false
saved_hoge_child.hoge_parent_id -&gt; 11
saved_hoge_parent.hoge_has_one = saved_hoge_has_one
saved_hoge_has_one.new_record? -&gt; false
saved_hoge_has_one.hoge_parent_id -&gt; 11
</pre>
代入が成功した時点で、自動的にhoge_parent_idが格納されてsaveが呼ばれる<br />
<br />
親が未保存<br />

<pre>post_save_hoge_parent = HogeParent.new
post_save_hoge_parent.name = "post_save hoge"
post_save_hoge_parent.new_record? = true
post_save_hoge_child = HogeChild.new
post_save_hoge_child.name = "post_save child"
post_save_hoge_child.new_record? = true
post_save_hoge_has_one = HogeHasOne.new
post_save_hoge_has_one.name = "post_save has_one"
post_save_hoge_has_one.new_record? -&gt; true
</pre>
親が未保存で、子のメソッドで代入<br />

<pre>post_save_hoge_child.hoge_parent = post_save_hoge_parent
post_save_hoge_child.new_record? -&gt; true
post_save_hoge_child.hoge_parent_id -&gt; nil
post_save_hoge_has_one.hoge_paent = post_save_hoge_parent
post_save_hoge_has_one.new_record? -&gt; true
post_save_hoge_has_one.hoge_parent_id -&gt; nil
</pre>
親が未保存で、子のメソッドで代入したもので、親を保存したとき<br />

<pre>post_save_hoge_parent.save -&gt; true
post_save_hoge_parent.new_record? -&gt; false
post_save_hoge_parent.id -&gt; 12
post_save_hoge_child.new_record? -&gt; true
post_save_hoge_child.hoge_parent_id -&gt; nil
post_save_hoge_has_one.new_record? -&gt; true
post_save_hoge_has_one.hoge_parent_id -&gt; nil
</pre>
親のsaveは伝播しない。子のhoge_parent_idも更新されない<br />
<br />
親を先に保存<br />

<pre>pre_saved_hoge_parent = HogeParent.new
pre_saved_hoge_parent.name = "pre_save hoge"
pre_saved_hoge_parent.save -&gt; true
pre_saved_hoge_parent.new_record? -&gt; false
pre_saved_hoge_parent.id -&gt; 13 
pre_saved_hoge_parent.new_record? = false
pre_saved_hoge_child = HogeChild.new
pre_saved_hoge_child.name = "pre_save child"
pre_saved_hoge_child.new_record? = true
pre_saved_hoge_has_one = HogeHasOne.new
pre_saved_hoge_has_one.name = "pre_save has_one"
pre_saved_hoge_has_one.new_record? -&gt; true
</pre>
親を先に保存して、子のメソッドで代入<br />

<pre>pre_saved_hoge_child.hoge_parent = pre_saved_hoge_parent
pre_saved_hoge_child.new_record? -&gt; true
pre_saved_hoge_child.hoge_parent_id -&gt; 13
pre_saved_hoge_has_one.hoge_parent = pre_saved_hoge_parent
pre_saved_hoge_has_one.new_record? -&gt; true
pre_saved_hoge_has_one.hoge_parent_id -&gt; 13
</pre>
自動的に保存はされない。当たり前だが、すでに親のIDはわかっているので、hoge_parent_idは格納されている]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2013-10-06T14:06:19+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/xcode/xcode%E3%81%AEgit%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">
    <link>https://whtiecrow.blog.shinobi.jp/xcode/xcode%E3%81%AEgit%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6</link>
    <title>XCodeのGitがうまくコミットできなかった件について</title>
    <description>最近はiOSアプリばっかりつくっているので、XCodeにはお世話になっているわけですが、
当然ソース管理は同梱されているGitを使うわけです。

が、このGit、コミットは出来てもロールバックは出来ない、という何とも片手落ちな仕様となっており、
先日もあちゃーということがあってロールバックす...</description>
    <content:encoded><![CDATA[最近はiOSアプリばっかりつくっているので、XCodeにはお世話になっているわけですが、<br />
当然ソース管理は同梱されているGitを使うわけです。<br />
<br />
が、このGit、コミットは出来てもロールバックは出来ない、という何とも片手落ちな仕様となっており、<br />
先日もあちゃーということがあってロールバックする為に、Google先生の助けを借りて、<br />
コマンド叩いてロールバックしたりした次第。<br />
<br />
で、はまったのが全角文字のファイル問題。<br />
<br />
データ提供元から送られてきたアイコン画像を使用したところ、<br />
突然コミットが出来なくなると言う状態が発生。<br />
<br />
コミットするのにファイルがねえ、という旨のメッセージが出て、コミットが進まない。<br />
<pre>
<code>error: pathspec &#39;問題のアイコンファイル名&#39; did not match any file(s)

というメッセージ。
ファイル名の一部がエスケープされていたので、ファイル名に全角がある為というのが分かった。

そこで、ファイル名(全角アルファベットが混じってた</code><code>ので、
</code><code>(Xcodeのフォントになれてなくて、全角と半角、見比べてみるまで判別ができない))
ファイル名を半角に変更。

コミットするも同じメッセージが。
で、コマンドから　git rm　とか、いろいろやってみるも変化なし。

で、更に調べると、
とにかくGitの設定にマルチバイト読込の設定をしてやる必要があると言うことが分かった。

コマンドから、

</code>git config --global gui.encoding utf-8

これで一件落着
</pre>
]]></content:encoded>
    <dc:subject>Xcode</dc:subject>
    <dc:date>2012-07-31T20:04:25+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/date_select%E3%81%AE%E5%88%9D%E6%9C%9F%E5%80%A4%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AE%E3%83%8F%E3%83%9E%E3%82%8A">
    <link>https://whtiecrow.blog.shinobi.jp/rails/date_select%E3%81%AE%E5%88%9D%E6%9C%9F%E5%80%A4%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AE%E3%83%8F%E3%83%9E%E3%82%8A</link>
    <title>date_selectの初期値設定でのハマり</title>
    <description>日付の選択は日時の選択で便利なビューヘルパのdate_selectとdatetime_select。

こんかいのハマりは初期値の設定。

特定の日付を指定するのは、第一引数にTimeデータを格納してやればいいのは知ってる。

しかし、

:prompt=&amp;amp;gt;true
とか、...</description>
    <content:encoded><![CDATA[日付の選択は日時の選択で便利なビューヘルパのdate_selectとdatetime_select。<br />
<br />
こんかいのハマりは初期値の設定。<br />
<br />
特定の日付を指定するのは、第一引数にTimeデータを格納してやればいいのは知ってる。<br />
<br />
しかし、<br />
<br />
:prompt=&gt;true<br />
とか、<br />
:include_blank=&gt;true<br />
とかやって、<br />
初期値をこのプロンプトもしくはブランクに指定する方法がわからなくて探した&hellip;<br />
<br />
ドキュメントに書いてないやん。<br />
<br />
ググって見ても、初期値に特定の日付を指定する方法ばかり出てくる。<br />
そんなんドキュメントにしっかり書いてあるやろが！!<br />
<br />
と半ばキレながら試した見た。<br />
<br />
そう、答えは簡単。<br />
第一引数にnilを入れると。<br />
<br />
でたよ～Rails得意の怪しかったら試してみろパターン。<br />
<br />
というわけで、<br />
解決しました&hellip;orz<br />
<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-10-18T01:41:27+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/rails2.3%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8B">
    <link>https://whtiecrow.blog.shinobi.jp/rails/rails2.3%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8B</link>
    <title>rails2.3のタイムロケールでハマる</title>
    <description>スケジューラー実装中のこと。

いろんな時間の予定を作って、特定の日時で切って取得するテストをする。
が、いざやってみると思ってない時間の予定が取得されてる。

おかしい。
とりあえずトレースしてみると、変な時間が入ってる。

午前0時に設定したはずが、午後3時とか。

境界テス...</description>
    <content:encoded><![CDATA[スケジューラー実装中のこと。<br />
<br />
いろんな時間の予定を作って、特定の日時で切って取得するテストをする。<br />
が、いざやってみると思ってない時間の予定が取得されてる。<br />
<br />
おかしい。<br />
とりあえずトレースしてみると、変な時間が入ってる。<br />
<br />
午前0時に設定したはずが、午後3時とか。<br />
<br />
境界テストのためにかなりの種類の予定を作っているので、<br />
打ち間違いとか、間違って上書きとかの可能性を探って見るもだめ。<br />
<br />
しょうがないので、<br />
代入する時間、代入された時間をトレースしてみる。<br />
代入するまではきちんとしてるのに、<br />
オブジェクトに代入したとたんにおかしなことになってる。<br />
<br />
あっれ～とか思いつつ、よくよく見てみると、<br />
オブジェクトに代入した時間がJST +00:00になってるよ。<br />
<br />
あ～、タイムロケールか～というわけで、タイムロケール設定をしていなかったんですねえ・・・<br />
<br />
/config/environment.rbで、<br />
<br />
config.time_zone = 'UTC'<br />
を<br />
config.time_zone = 'Tokyo'<br />
に変更。<br />
<br />
ちゃんとJST +09:00になりました。<br />
<br />
ちゃんちゃん。<br />
<br />
#　ってﾀﾞﾒﾀﾞｺﾚ<br />
どうもDBへの入出力でおかしくなってるみたいで一度保存するとおかしな状態のままになってる。<br />
しょうがないので、国内限定、ってことで<br />
#&nbsp;config.time_zone = 'Tokyo'<br />
とコメントアウトして対応。<br />
<br />
orz<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-02-16T19:05:41+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/activerecord--base.destory%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B">
    <link>https://whtiecrow.blog.shinobi.jp/rails/activerecord--base.destory%E3%82%92%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%99%E3%82%8B</link>
    <title>ActiveRecord::Base.destoryをオーバーライドする</title>
    <description>テーブル関連、has_oneとかhas_manyとかの関連を持っているとき、
ついついActiveRecord::Base.destroyとかをオーバーライドしたくなるときがある。

例:

class Parent &amp;amp;lt; AciveRecord::Base
&amp;amp;nbsp; has_m...</description>
    <content:encoded><![CDATA[テーブル関連、has_oneとかhas_manyとかの関連を持っているとき、<br />
ついついActiveRecord::Base.destroyとかをオーバーライドしたくなるときがある。<br />
<br />
例:<br />
<br />
class Parent &lt; AciveRecord::Base<br />
&nbsp; has_many :chidren, :dependent=&gt;:destroy<br />
<br />
&nbsp; # 属性:deleted, :boolean, :default=&gt;false<br />
<br />
end<br />
<br />
class Child &lt; AciveRecord::Base<br />
&nbsp; belongs_to :parent<br />
<br />
&nbsp; # 属性:deleted, :boolean, :default=&gt;false<br />
<br />
end<br />
<br />
親も子も関連する全員が@deletedがtrueになったときだけ全削除の実行に入る、<br />
という必要があったとする。<br />
<br />
親の方は簡単で、エイリアスを作ってオーバーライドすればいい。<br />
<br />
class Parent &lt; AciveRecord::Base<br />
&nbsp; has_many :children, :dependent=&gt;:destroy<br />
<br />
&nbsp; alias :destroy! :destroy<br />
&nbsp; <br />
&nbsp; def&nbsp; check_destory<br />
&nbsp;&nbsp;&nbsp; if # 自分と子が全員削除可能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.destory!<br />
&nbsp;&nbsp;&nbsp; end<br />
&nbsp; end<br />
<br />
&nbsp; def destroy<br />
&nbsp;&nbsp;&nbsp; self.deleted = true<br />
&nbsp;&nbsp;&nbsp; return self.save<br />
&nbsp;&nbsp;&nbsp; retrun check_destroy<br />
&nbsp; end<br />
<br />
end<br />
<br />
てな感じ。<br />
<br />
問題は子のほう。<br />
<br />
メソッドを普通にオーバーライドすると、親の方が削除された時に、<br />
自動的にdestoryが呼ばれるので無限ループに陥ってしまう。<br />
<br />
で、苦肉の策で考えたのがこの方法。<br />
<br />
class Child &lt; ActiveRecord::Base<br />
&nbsp; belongs_to :parent<br />
&nbsp; <br />
&nbsp; def destroy<br />
&nbsp;&nbsp;&nbsp; if caller.to_s =~ /.+has_many_dependent_destroy_for_message_receiver_relations.+/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.deleted = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.save<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.parent.check_destroy<br />
&nbsp;&nbsp;&nbsp; end<br />
&nbsp; end<br />
<br />
end<br />
<br />
callerで呼び出し元をたどって、<br />
そこにhas_many_dependent_destroy_for_message_receiver_relations<br />
(関連で:dependent=&gt;:destroyを設定したときに、自動で呼び出される)<br />
が含まれていたら親が削除された一連の動作で削除されていると判断して、<br />
superを呼び出し、<br />
それ以外はフラグを設定してそこで処理を握りつぶすという方法。<br />
<br />
これなら、親が削除されたとき以外は削除されずにすむ。<br />
<br />
callerのチェックとかってあんまりやりたくないんだけど、<br />
この方法ってなんか問題あるのかしら。<br />
<br />
滅多に使わない方法なのでちょっと悩む。<br />
てか、なんかほかのもっといい方法があったら教えてほしい。<br />
<br />
<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-02-06T11:28:42+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%A7%E9%96%A2%E9%80%A3%E5%85%88%E3%81%8C%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82">
    <link>https://whtiecrow.blog.shinobi.jp/rails/activerecord%E3%81%A7%E9%96%A2%E9%80%A3%E5%85%88%E3%81%8C%E3%83%AD%E3%83%BC%E3%83%89%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%82</link>
    <title>ActiveRecordで関連先がロードされているかどうかを判定する。</title>
    <description>Railsアプリの最大のボトルネックとなりうるのはSQLとのやりとりである。
（Erbのレンダラーだという話は置いておく)

なので、Railsアプリでチューニングを行う時に真っ先に手をつけるのは
AR.find系のDBアクセスな部分になる。

ちょっとしたアプリを作れば、(普通にモデリ...</description>
    <content:encoded><![CDATA[Railsアプリの最大のボトルネックとなりうるのはSQLとのやりとりである。<br />
（Erbのレンダラーだという話は置いておく)<br />
<br />
なので、Railsアプリでチューニングを行う時に真っ先に手をつけるのは<br />
AR.find系のDBアクセスな部分になる。<br />
<br />
ちょっとしたアプリを作れば、(普通にモデリングしている限り)複数の関連モデルができあがる。<br />
この場合、チューニングのポイントはEagerLoadingにあり、<br />
:hoge has_many :fugas<br />
:fuga has_many :piyos<br />
という関連にある場合は、一発ですべて取得できるこれは非常に便利。<br />
<br />
Hoge.find(id, :include=&gt;{:fugas=&gt;:piyos})<br />
とやれば、すべての関連をインスタンス化した状態で取得できる。<br />
<br />
これは便利なので、結構めくら滅法使ってしまう。<br />
関連先をループで回して表示したりすることがあるときは、これだけでかなりのチューニングになる。<br />
<br />
さて、<br />
ここからが本題。<br />
<br />
たいていの場合、親になるモデルをインスタンス化するのはコントローラーの責務になる。<br />
(当たり前ですが)<br />
<br />
で、ちょっと複雑なことになったモデルクラスで、<br />
parent.childlen.find(:all, :conditions=&gt;[conditions])<br />
みたいに取得するか、find_by_sqlするか、<br />
それともループを回して配列にコピーするのがいいのか、<br />
判断に迷うことがある。<br />
<br />
こんな時、すでにEagerLoadingでロードされているのか、<br />
はたまたロードされていないのか判断ができれば処理分岐で対応できる。<br />
<br />
<strong>loaded?</strong><br />
<br />
これで判定がつく<br />
<br />
parent has_many :children<br />
<br />
だったとき、parentクラス上で、<br />
<br />
if self.childlen.loaded?<br />
&nbsp; # ループで回す処理<br />
else<br />
&nbsp; # DBアクセスを伴う処理<br />
end<br />
<br />
という感じ。<br />
<br />
ちなみにテスト上では反映されないので注意。<br />
<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-02-03T17:47:19+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/activerecord%E3%81%A7in%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%83%BB%E3%83%BB%E3%83%BB">
    <link>https://whtiecrow.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/activerecord%E3%81%A7in%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E3%83%BB%E3%83%BB%E3%83%BB</link>
    <title>ActiveRecordでINが使えない・・・</title>
    <description>ActiveRecordのfindメソッドの:conditionsオプションって、INを判ってくれない・・・

class Hoge
&amp;amp;nbsp; :has_many :relations
&amp;amp;nbsp; :has_many :fugas, :through=&amp;amp;gt;relations

...</description>
    <content:encoded><![CDATA[ActiveRecordのfindメソッドの:conditionsオプションって、INを判ってくれない・・・<br />
<br />
class Hoge<br />
&nbsp; :has_many :relations<br />
&nbsp; :has_many :fugas, :through=&gt;relations<br />
<br />
class Fuga<br />
&nbsp; :has_many :relations<br />
&nbsp; :has_many :hoges, :through=&gt;relations<br />
<br />
class Relation<br />
&nbsp; belongs_to :hoge<br />
&nbsp; belongs_to :fuga<br />
<br />
とあったとして、Hogeインスタンス上から、<br />
Fugaインスタンス配列を元にRelationインスタンス配列がほしかったとする。<br />
<br />
ナチュラルに考えて試してみる<br />
self.relations.find(:all, :conditions=&gt;[&quot;fuga_id IN (?)&quot;, fugas])<br />
# nil<br />
<br />
じゃあID配列で<br />
self.relations.find(:all, :conditions=&gt;[&quot;fuga_id IN (?)&quot;, fugas.map{|f| f.id}])<br />
# nil<br />
<br />
それじゃあID配列をjoinしてカンマ区切りに<br />
self.relations.find(:all, :conditions=&gt;[&quot;fuga_id IN (?)&quot;, fugas.map{|f| f.id}.join(',')])<br />
# 最初の一つ目だけ<br />
<br />
find_by～ならどうだ！！<br />
self.relations.find_by_fuga_id(fugas.map{|f| f.id})<br />
# 最初の一つ目だけ<br />
<br />
まあ、当然ですよね・・・<br />
<br />
結局find_by_sqlに頼ってしまうのね・・・<br />
<br />
Relation.find_by_sql(&quot;SELECT * FROM relations WHERE hoge_id = #{self.id} AND fuga_id IN (#{fugas.map{|f| f.id}.join(',')})&quot;)<br />
<br />
ActiveRecordって、ある一線を越えるとSQLを直接叩く方が早くてわかりやすいよね・・・<br />
ちゃんちゃん<br />]]></content:encoded>
    <dc:subject>未選択</dc:subject>
    <dc:date>2010-02-02T18:21:56+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/%E3%81%9D%E3%81%AE%E4%BB%96/radrails%E3%81%AE-identical%20code%20structure%E3%80%80%EF%BD%9E-%E3%83%AF%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99">
    <link>https://whtiecrow.blog.shinobi.jp/%E3%81%9D%E3%81%AE%E4%BB%96/radrails%E3%81%AE-identical%20code%20structure%E3%80%80%EF%BD%9E-%E3%83%AF%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99</link>
    <title>RadRailsの[identical code structure　～]ワーニングを消す</title>
    <description>AptanaRadRailsを愛用しております。
NetBeansよりもコードアシストがよくなかったりとか、いろいろアレ気なところも多いIDEですが、
まあ、手になじんでいるのもあって愛用しています。

しかし、先日アップデートしてから非常にウザいワーニングが出まくりました。

iden...</description>
    <content:encoded><![CDATA[AptanaRadRailsを愛用しております。<br />
NetBeansよりもコードアシストがよくなかったりとか、いろいろアレ気なところも多いIDEですが、<br />
まあ、手になじんでいるのもあって愛用しています。<br />
<br />
しかし、先日アップデートしてから非常にウザいワーニングが出まくりました。<br />
<br />
identical code structure　～<br />
<br />
というワーニングが、コードのありとあらゆるところに出まくってます。<br />
<br />
「似たようなコードがほかにもあるから、メソッド化してDRYを保てよ～」という意図らしいですが、<br />
<br />
UnitTestのコードとか、<br />
ActiveRecordのFindメソッド呼び出しとか、<br />
ちょっとしたハッシュの定義とかでも出まくる。<br />
<br />
確かにぱっと見似たコードですよ・・・<br />
でもこれ以上どうしようもないじゃん。<br />
あんたちゃんと見てないでしょ・・・という感じ。<br />
<br />
はじめはいちいち[Igonre this warning]とかをクリックして消していたけど、<br />
あまりにもウザ過ぎる。<br />
<br />
で、肝心の消し方。<br />
<br />
Window-&gt;Prefanceから<br />
Ruby-Erorors/Warnings-Duplicate Codeで<br />
Enable checking my code for duplicate AST structuresのチェックを外す。<br />
<br />
環境の再構築をしているらしく、しばらく待たされるけど、<br />
これでウザいワーニングは出なくなりました。<br />
<br />
本家のTracにも載ってたので、世界中からウザいと思われてたんでしょうね・・・<br />
<br />]]></content:encoded>
    <dc:subject>その他</dc:subject>
    <dc:date>2010-02-02T17:46:28+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%81%AE%E6%B3%A8%E6%84%8F">
    <link>https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E3%81%AE%E9%96%A2%E9%80%A3%E3%81%A7%E3%81%AE%E6%B3%A8%E6%84%8F</link>
    <title>FactoryGirlの関連での注意</title>
    <description>FactoryGirlで、
関連を表現したいときは
fuga belongs_to :hogeだったとすると

Factory.define :hoge_name, :class=&amp;amp;gt;Hoge do |h|
&amp;amp;nbsp; h.name &#039;name&#039;
end

Factory.de...</description>
    <content:encoded><![CDATA[FactoryGirlで、<br />
関連を表現したいときは<br />
fuga belongs_to :hogeだったとすると<br />
<br />
Factory.define :hoge_name, :class=&gt;Hoge do |h|<br />
&nbsp; h.name 'name'<br />
end<br />
<br />
Factory.define :fuga_name, :class=&gt;Fuga do |f|<br />
&nbsp; f.name 'fuga'<br />
&nbsp; f.hoge Factory(:hoge)<br />
end<br />
<br />
と書けるんだと理解していた。ブレース（｛｝）で囲む必要があるのは、遅延ロードしたいときだけ、<br />
という認識だったんだが、どうも違うみたい。<br />
<br />
きちんとブレースで囲んで、<br />
&nbsp; f.hoge { Factory(:hoge) }<br />
とやってやらないと、rakeでエラーが帰ってくる。<br />
<br />
どうやらFactoryGirlがDBのテーブルにfuga.hoge(関連名そのままのカラム)を探しに行くらしい。<br />
<br />
<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-01-25T10:44:54+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
  <item rdf:about="https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E5%B0%8E%E5%85%A5">
    <link>https://whtiecrow.blog.shinobi.jp/rails/factorygirl%E5%B0%8E%E5%85%A5</link>
    <title>FactoryGirl導入</title>
    <description>新しいプロジェクトでテストをきちんと書くのに、
どうもリレーションが多いモデルなので、
まじめにFixtureを書こうとすると気が狂いそうになる。

特に、Railsのバージョンを2.3.5に変えたので、
IDが自動的に生成されちゃうので、なおのこと関連どうかけってよ・・・orz
なこと...</description>
    <content:encoded><![CDATA[新しいプロジェクトでテストをきちんと書くのに、<br />
どうもリレーションが多いモデルなので、<br />
まじめにFixtureを書こうとすると気が狂いそうになる。<br />
<br />
特に、Railsのバージョンを2.3.5に変えたので、<br />
IDが自動的に生成されちゃうので、なおのこと関連どうかけってよ・・・orz<br />
なことに。<br />
<br />
とりあえずFixtureのヘルプをみるも、omapを使え、とか書いてあるし。<br />
調べてみるとかなりめんどくさそう。<br />
ということで見つけたのが<a href="http://www.func09.com/wordpress/archives/532">ここ</a><br />
<br />
なるほどねえ・・・<br />
ということで導入決定。<br />
<br />
親切に書いてあるけど、一応<a href="http://thoughtbot.com/projects/factory_girl/">本家</a>を参照しつつやってみる。<br />
<br />
しかしまあ、どこも今はRSpecが標準らしく、<br />
使い方はどこもRSpec向けの設定ばかり。<br />
<br />
その上なんかテストの形式も変わってるし・・・<br />
test &quot;hoge&quot; do　て何？<br />
という感じですっかり時代に取り残された気分。<br />
<br />
まあ、とにかくfactoriesディレクトリを作成して*.rbファイルを作り、<br />
中にFactory.defuineなものを書いて設定するとよし。<br />
<br />
ただ、Fixtureと違って自動的にロードしてくれないので、<br />
各テストのsetupメソッドでファクトリを呼び出してインスタンス化とかしておかないとだめ。<br />
<br />
逆に、細かくセーブ前、セーブ済み、属性のみ、スタブのみとかコントロールできるので<br />
それはそれでいいかも。<br />
<br />
というわけで、ちょっと使い込んでみます。<br />
<br />
#　調べている時に、YAMLの中に&lt;%= %&gt;でRuby記述できることを今回初めて知ったのは内緒<br />
<br />]]></content:encoded>
    <dc:subject>rails</dc:subject>
    <dc:date>2010-01-20T20:39:33+09:00</dc:date>
    <dc:creator>r2o</dc:creator>
    <dc:publisher>NINJA BLOG</dc:publisher>
    <dc:rights>r2o</dc:rights>
  </item>
</rdf:RDF>
