0

我来寻求你的集体智慧。

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

我想了很多关于如何做到最好。我曾想过直接插入数据库,但在谷歌上搜索了一下后我就冷落了。似乎建立第二个数据库连接并不难,我不喜欢的是在另一个应用程序运行时更改它的数据库。如果我基于迷信放弃了一个完全合理的选择,请说些什么。

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

  1. 节点(基本上是计算机)
  2. node_groups(您可以将计算机放入的组)
  3. node_group_memberships(将 1 和 2 相互关联的连接表)

我可以添加和删除两个节点和 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 Labs 的好人提供),我可以看到有一个 create 方法

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 个痛苦的小时来试图弄清楚。谢谢!

4

1 回答 1

0

不管是好是坏,一个有用的方法是使用相同的 Rails 应用程序连接到第二个数据库。我暂时将此标记为“答案”,而不是“答案”。

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

于 2012-03-07T02:03:34.333 回答