私はあなたの集団の知恵を探しに来ました。ActiveResourceを使用して別のアプリケーションのデータベースを操作する
私の目標、概要: さまざまなクライアントのコンピュータをよりよく管理するために、私はPuppetのDashboardを拡張しようとしています。それはRails 2のアプリケーションです。私が書いているRails 3のアプリケーションでそれを拡張しようとしています。 Dashboardを自分のニーズに合わせるのには不十分な問題がいくつかありますが、その解決方法は簡単です。私はこの質問の答えが残りの部分を把握するのに役立つと感じているので、1つに集中するつもりです。私は、ダッシュボードのコードをまったく変更しないソリューションを探してきました。なぜなら、私はメンテナではなく、将来の混乱を避けたいからです。
私はこの最高のやり方について多くのことを考えました。私はデータベースに直接接続することを考えましたが、私はちょっとグーグル・グーグルでやってしまいました。 2番目のデータベース接続を設定することはそれほど難しくはないようですが、私が気に入らないのは、実行中に別のアプリケーションのデータベースを変更することです。私が迷信に基づいて完全に合理的な選択肢を追い越すならば、何か言いなさい。
他にもいくつかのアイデアがありましたが、私が最後にやり始めたのは、RESTを介してDashboardのデータベースにアクセスすることでした。それは組み込まれている、なぜそれを使用しない?まあ、私はテーブルのカップルを操作することができましたが、私がしたいものではありません。したがって、この状況では3つのテーブルがあります。
- ノード(基本的にはコンピュータ)
- node_groups
- node_group_memberships(お互いに1と2を関連付ける結合テーブル)
私が追加することができます(あなたがコンピュータを置くことができるグループ) nodeとnode_groupsの両方のノードを削除しますが、2つのノード間の接続も作成できるようにしたいと考えています。新しいユーザーを作成するために、私はこのようになりますように設定ActiveResourceモデルを持っている:
class PuppetNode < ActiveResource::Base
self.site = "http://127.0.0.1:4000/"
self.element_name = "node"
attr_accessor :grouped
end
私は、新しいノードを作成して自由だ、またはコンソール経由でノードテーブルから情報をつかみます。
PuppetNode.create(:column_name => "and so on")
同じことがnode_groupsのために行く、と私もnode_group_membershipsのためにかつらはありませんが、私はそのテーブルに何かを作成することはできませんRailsの3モデルを作成することができます:それは次のようになります。私は(人形研究所の良い人々オーバーにより)Railsの2 node_group_membershipコントローラを見れば、私はそれが私が作成しようとするたびに出てチョークしかし、何らかの理由のための方法に
class NodeGroupMembershipsController < InheritedResources::Base
respond_to :json
before_filter :raise_if_enable_read_only_mode, :only => [:new, :edit, :create, :update, :destroy]
before_filter :standardize_post_data, :only => [:create]
def create
create! do |success, failure|
success.json { render :text => @node_group_membership.to_json, :content_type => 'application/json', :status => 201 }
failure.json { render :text => {}.to_json, :content_type => 'application/json', :status => 422 }
end
end
# we want: {node_group_membership => {node_id => <id>, node_group_id => <id>}
# allow and convert: {node_name => <name>, group_name => <name>}
def standardize_post_data
unless params[:node_group_membership]
params[:node_group_membership] = {}
node = Node.find_by_name(params[:node_name])
group = NodeGroup.find_by_name(params[:group_name])
params[:node_group_membership][:node_id] = (node && node.id)
params[:node_group_membership][:node_group_id] = (group && group.id)
end
end
end
を作成するがあることを、見ることができますこの
irb(main):005:0> PuppetNodeGroupMembership.create(:node_id => 20, :node_group_id => 5)
=> #<PuppetNodeGroupMembership:0x007fb3150af878 @attributes={"node_id"=>20, "node_group_id"=>5}, @prefix_options={}, @persisted=false, @remote_errors=#<ActiveResource::ResourceInvalid: Failed. Response code = 422. Response message = .>, @validation_context=nil, @errors=#<ActiveResource::Errors:0x007fb3150af4e0 @base=#<PuppetNodeGroupMembership:0x007fb3150af878 ...>, @messages={}>>
何かアドバイスのようなものとの関連がはるかに高く評価されるだろう、私はすでにそれを理解しようとしているに固体8悲惨な時間を置いてきました。ありがとう!