<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>func09 &#187; activerecord</title>
	<atom:link href="http://www.func09.com/wordpress/archives/tag/activerecord/feed" rel="self" type="application/rss+xml" />
	<link>http://www.func09.com/wordpress</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 04:25:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[Rails3][Mongoid] スレッド式掲示板を作ってみた</title>
		<link>http://www.func09.com/wordpress/archives/980</link>
		<comments>http://www.func09.com/wordpress/archives/980#comments</comments>
		<pubDate>Mon, 16 Aug 2010 02:22:38 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mongoid]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=980</guid>
		<description><![CDATA[Rails3で簡単なサンプルを作ってみた スレッド式掲示板です。 レスは追加できるけど、スレッド追加する機能は作り忘れた。 Mongoid版 http://github.com/func09/rails3_sample_ [...]]]></description>
			<content:encoded><![CDATA[<p>Rails3で簡単なサンプルを作ってみた
スレッド式掲示板です。</p>

<p><img class="alignnone size-medium wp-image-984" title="Bbs" src="http://www.func09.com/wordpress/wp-content/uploads/Bbs-300x282.jpg" alt="" width="300" height="282" /></p>

<p><img class="alignnone size-medium wp-image-983" title="Bbs-1" src="http://www.func09.com/wordpress/wp-content/uploads/Bbs-1-300x280.jpg" alt="" width="300" height="280" /></p>

<p>レスは追加できるけど、スレッド追加する機能は作り忘れた。</p>

<p><strong>Mongoid版</strong></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/tree/mongoid-20100813">http://github.com/func09/rails3_sample_bbs/tree/mongoid-20100813</a></p>

<p><strong>ActiveRecord版</strong></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/tree/activerecord-20100813">http://github.com/func09/rails3_sample_bbs/tree/activerecord-20100813</a></p>

<p>それぞれのREADMEに従えば動くはず。
rake db:seed でサンプルデータがインサートされるます。</p>

<p>Rails3だからといって、別段特殊なコードは書けなかった。
よくもわるくもいつもどおり書けた。</p>

<p><a href="http://github.com/func09/rails3_sample_bbs/zipball/mongoid-20100813">http://github.com/func09/rails3_sample_bbs/zipball/mongoid-20100813</a></p>

<p><a href="http://github.com/func09/rails3_sample_bbs/zipball/activerecord-20100813">http://github.com/func09/rails3_sample_bbs/zipball/activerecord-20100813</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/980/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails]ActiveRecord.serializeでオブジェクトをDBに保存する</title>
		<link>http://www.func09.com/wordpress/archives/577</link>
		<comments>http://www.func09.com/wordpress/archives/577#comments</comments>
		<pubDate>Thu, 21 May 2009 02:48:50 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[日記]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=577</guid>
		<description><![CDATA[DBに配列やハッシュのデータを保存したいなと思って調べました。 ActiveRecord.serializeで実に簡単に実現できるんですね。 http://api.rubyonrails.org/classes/Acti [...]]]></description>
			<content:encoded><![CDATA[<p>DBに配列やハッシュのデータを保存したいなと思って調べました。</p>

<p>ActiveRecord.serializeで実に簡単に実現できるんですね。<br />
<a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002229">http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002229</a></p>

<blockquote>If you have an attribute that needs to be saved to the database as an object, and retrieved as the same object, then specify the name of that attribute using this method and it will be handled automatically.

The serialization is done through YAML. If class_name is specified, the serialized object must be of that class on retrieval or SerializationTypeMismatch will be raised.
</blockquote>

<p>このメソッドでオブジェクトとして保存・取得したい属性の名前を指定すると、自動的に処理されるようになる。
YAMLでシリアライズされ、class_nameオプションが指定されると格納できるオブジェクトのクラスを制限できる。あるいはSerializationTypeMismatchの例外となる。</p>

<h2>ポイント</h2>

<ul>
<li>シリアライズしたいカラムの型をtextにする</li>
<li>serializeメソッドでカラムを指定する</li>
<li>格納できるクラスを指定可能</li>
<li>内部的にはYAML</li>
</ul>

<h2>実例</h2>

<p>さて、やってみます</p>

<p>まずマイグレーション内で、text型のdataというフィールドを用意する。<br />
ここにシリアライズしたデータが格納されます。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class CreateItems &lt; ActiveRecord::Migration<br />
&nbsp; def self.up<br />
&nbsp; &nbsp; create_table :items do |t|<br />
&nbsp; &nbsp; &nbsp; t.text :data<br />
&nbsp; &nbsp; end<br />
&nbsp; end<br />
&nbsp; def self.down<br />
&nbsp; &nbsp; drop_table :items<br />
&nbsp; end<br />
end</div></div>

<p>そしてモデル内でシリアライズするフィールドを指定。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Item &lt; ActiveRecord::Base<br />
&nbsp; # シリアライズされたデータとして扱いたいフィールドを指定する<br />
&nbsp; serialize :data<br />
end</div></div>

<p>script/consoleなどをおもむろに起動し、本当にオブジェクトが保存できるのか確認します。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># 配列を代入する<br />
Item.create :data =&gt; [1,2,3]<br />
<br />
item = Item.find(:all).last<br />
p item.data #=&gt;[1,2]<br />
p item.data.class #=&gt;Array</div></div>

<p>ちゃんと配列として取得できました。めでたしめでたし。</p>

<h2>どうなってるの？</h2>

<p>DBに格納する際にオブジェクトをYAML化しているようです。</p>

<h2>検索したい場合</h2>

<p>findしたい場合は、オブジェクトではなく文字列として評価されてしまうので
Object#to_yamlを使うことになります。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Item.find_by_params([1,2,3]) # =&gt; これではレコードが見つからない<br />
Item.find_by_params([1,2,3].to_yaml) # =&gt; 見つかる</div></div>

<p>使い勝手が悪い。。</p>

<h2>格納する型を限定する</h2>

<p>このままだとオブジェクトならなんでも格納できてしまいます。
そこで格納するクラスを指定してやります。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Item &lt; ActiveRecord::Base<br />
&nbsp; # 配列以外のクラスは格納しない<br />
&nbsp; serialize :data, Array<br />
end</div></div>

<p>script/consoleで試してみます</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># 配列の格納は成功<br />
&gt;&gt; Item.create :data =&gt; ['bob','alice']<br />
=&gt; #&lt;item id: 1, data: [&quot;bob&quot;, &quot;alice&quot;]&gt;<br />
<br />
# ハッシュの格納は例外が発生する<br />
&gt;&gt; Item.create :data =&gt; {:name =&gt; 'bob'}<br />
ActiveRecord::SerializationTypeMismatch: data was supposed to be a Array, but was a Hash</div></div>

<p>これでかなり使い勝手が良くなりましたけど、配列の中身までは保証できないので、精神的安定のために使う程度でしょうか？</p>

<h2>最後に</h2>

<p>DBにシリアライズしたデータを保存しなければならない状況は無いにこした事は無いと思いますので
設計レベルで回避できる場合はそちらをおすすめします。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/577/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

