2012/07/15

ActiveResourceかActiveRecordか

Redmineで番組録画チケット管理するために、まず放送番組を自動でチケット化する処理を書かねばならない。RedmineはRubyOnRailsのシステムなので、RailsのActiveResourceでやればいいんだよねって気軽に考えていた。

require 'rubygems'
require 'active_resource'
class Redmine < ActiveResource::Base
    self.site = 'http://localhost'
    self.user = '[login-id]'
self.password = '[password]'
end
class Project < Redmine
end
class Issue < Redmine
end

これだけでチケット(Issue)レコードへ簡単にアクセスできるようになる。
self.site、self.user、self.passwordはRedmine上のアカウント。普通にアクセスして操作するのと同じ事をスクリプトで出来るってことだね。
SQLコマンドを知らなくても変換してくれる便利機能だなので使わない手はないだろうとやってみたが。

project = Project.find(:all)  プロジェクト一覧取得

エラーだよ
/var/lib/gems/1.9.1/gems/activeresource-3.2.6/lib/active_resource/base.rb:929:in `instantiate_collection': undefined method `collect!' for # (NoMethodError)
        from /var/lib/gems/1.9.1/gems/activeresource-3.2.6/lib/active_resource/base.rb:901:in `find_every'
        from /var/lib/gems/1.9.1/gems/activeresource-3.2.6/lib/active_resource/base.rb:813:in `find'
        from project.rb:24:in `
'

ん?なんじゃこれは?
色々調べてみたが、Railsの不具合でもなければRedmineの不具合でもないらしい。
お互いの整合性がちゃんと取れていないのでは?というのが自分の結論だ。

Collection-resources-and-pagination
こちらの記事を読んで、何となくだけど納得した。

回避策?
IssueもProjectと同じエラーがでるので、Issueで説明すると

app/views/issues/index.api.srb ファイルの最初の
api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :limit => @limit) do

api.array :issues do
に変更してすることで、エラーがなくなった。Projectも同じ対処で回避できた。
collect!を作ればいいんだよとか、Hashの問題だとか、色々あったけど・・・


検索〜
  issues = Issue.find(:all, :conditions => {:project_id => 1})
ん?全然検索できない・・・
issues = Issue.find(:all, :params => {:project_id => 1})
ActiveResourceだと:paramsなんだと。


この辺で、もういいや。ActiveResourceは、使わない事にした。

Railsからちゃんと習得していれば問題ないかもしれないけど、redmineがRailsだったから使ってみようと思ったんで、その辺の基礎知識が乏しい。
ネット検索してみると、ActiveResourceより、ActiveRecordの方が情報が豊富だし。
なにより、redmineのモデル部分はActiveRecordで記述されているんで参考にしやすい。

ということで、DB周りの自動処理はActiveRecordでやることにしたよ。


require 'rubygems'
require 'active_record'

ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:host => 'localhost',
:username => 'redmine',
:password => 'redmine',
:database => 'redmine'
)

class Issue < ActiveRecord::Base
end

ActiveRecordだとこんな感じでredmineDBにアクセスできるようになる。
establish_connectionの中は、redmineのconfig/database.ymlに記述したのと同じ内容を書けばいい。

チケット検索は、Issue.find。作成は、Issue.new で簡単に操作できるね。
こっちの方がDBレコードのイメージそのままな感じなんでフィーリングが合ってる。
初心者の私が色々書いてもしょうがないので、この辺の詳しい事は他を参照してね。

まだ初歩的な使い方しか出来ないけど、それでも目的のものは構築できそうだ。
次回からは、構築関係を書いてみる予定。

0 件のコメント:

コメントを投稿