使用ActiveResource来操作另一个应用程序的数据库

时间:2012-03-06 01:37:57

标签: activeresource ruby-on-rails-2 ruby-on-rails-3.2 puppet

我来寻求你的集体智慧。

我的目标,概述: 为了更好地管理各种客户端的计算机,我试图扩展Puppet的Dashboard。它是一个Rails 2应用程序,我正在尝试使用我正在编写的Rails 3应用程序扩展它。有一些问题使得仪表板不能满足我的需求,但解决方案很简单。我将专注于一个,因为我觉得这个问题的答案将帮助我解决剩下的问题。我一直在寻找不会改变仪表板代码的解决方案,因为我不是维护者,也不想让未来变得混乱。

我考虑过如何做到最好。我想过直接插入数据库但是我做了一点谷歌搜索后感到很冷淡。似乎设置第二个数据库连接并不困难,我不喜欢的是在运行时更改另一个应用程序的数据库。如果我在迷信的基础上放弃一个完全合理的选择,请说些什么。

还有一些其他的想法,但我最后开始的那个想法,并且通过REST访问Dashboard的数据库取得了微不足道的成功。它是内置的,为什么不使用它?好吧,我能够操纵几张桌子,但不能操纵我想要的桌子。所以在这种情况下有三个表需要注意。

  1. 节点(基本上是计算机)
  2. node_groups(您可以将计算机放入的组)
  3. node_group_memberships(将1和2相互关联的联接表)
  4. 我可以添加和删除节点和node_groups,但我希望能够在两者之间创建连接。为了创建一个新用户,我有一个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控制器(由Puppet实验室的好人),有一个创建方法

    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个小时才试图弄明白。谢谢!

1 个答案:

答案 0 :(得分:0)

无论好坏,有一件事可行,就是使用相同的Rails应用程序连接到第二个数据库。我暂时将其标记为“答案”,但不是“答案”。

这是我发现帮助我的资源: http://www.rubynaut.net/articles/2008/05/31/how-to-access-multiple-database-in-rails.html