プラグイン開発記 - レコードの一括変更

用語集プラグイン に用語集のプロジェクトの変更機能を追加した。

http://www.r-labs.org/issues/750

画面を作ったりとかはすんなりできたのだが、プロジェクト変更後の用語の保存で結構はまってしまった。
最初の方針では、 find(:all, ...) メソッドでプロジェクトの用語と用語のカテゴリの配列を取得して、 一個づつプロジェクト ID を変更して、 save メソッドで保存していくようにしていた。しかし、何故か save メソッドが false を返して、保存に失敗していた。

原因が分からなかったので、 調べていたら、save メソッドを save! にすると、保存時に false を返すのではなく、例外を発生させることができるらしいということがわかった。
http://www.atmarkit.co.jp/fcoding/rails/articles/rails3/04/rails304a.html
そこで、 save! を使ってわざと例外を発生させてみると、プロジェクトが指定されていないということでエラーになっていた。
それで、よくみてみると id メソッドで変更後のプロジェクトを取得するとき、間違って Project クラスのオブジェクトではなく、単に識別名の文字列のオブジェクトに対して id メソッドを呼び出していた。
Ruby の全ての上位クラスである Object クラスにも id メソッドがあって、それで String でもエラーとはならず、おかしな値をプロジェクト ID に入れていたらしい。

原因が分かったので、そのまま修正しても良かったのだが、調べているときに update_all という ActiveRecord のクラスメソッドを使えば、一気に変更できるということも知ったので、そちらを使うことにした。
次のようにして用語とカテゴリのプロジェクトを変更するようにすると上手く動くようになった。
      [TermCategory, Term].each {|cl|
        cl::update_all("project_id = #{newproj.id}", "project_id = #{@project.id}")
      }
ただ、この update_all メソッドは、第一引数が変更の操作で、第二引数が変更対象の条件になっていて、 第二引数を省略するためにそうなっているのだとは思うが、感覚的に逆の方がしっくりくる気がして、ちょっと分かりづらい。

この機能追加で 0.6.0 の変更予定が完了したので、後はざっと確認して、翻訳してもらったら、 0.6.0 をリリースできそう。

Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
(2008/05/31)
大場 寧子、大場 光一郎 他

商品詳細を見る

Rails Way (Professional Ruby Series)Rails Way (Professional Ruby Series)
(2008/12/04)
Obie Fernandez

商品詳細を見る
関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
35位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

05月 | 2017年06月 | 07月
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。