Использование ActiveResource для управления базой данных другого приложения

Я пришел за вашей коллективной мудростью.

Моя цель, обзор: чтобы лучше управлять компьютерами для различных клиентов, я пытаюсь расширить Dashboard Puppet. . Это приложение Rails 2, и я пытаюсь расширить его с помощью приложения Rails 3, которое я пишу. Есть несколько проблем, из-за которых Dashboard не совсем подходит для моих нужд, но решения просты. Я собираюсь сосредоточиться на одном, потому что чувствую, что ответ на этот вопрос поможет мне понять остальные. Я искал решения, которые вообще не изменяют код панели инструментов, потому что я не сопровождающий и не хочу создавать беспорядок в будущем.

Я много думал о том, как это сделать лучше всего. Я думал о том, чтобы подключиться непосредственно к базе данных, но я струсил после того, как немного погуглил. Похоже, настроить второе соединение с базой данных не так уж и сложно, мне не нравится изменять базу данных другого приложения во время его работы. Пожалуйста, скажите что-нибудь, если я отказываюсь от вполне разумного варианта, основанного на суеверии.

Было еще несколько идей, но та, с которой я наконец начал и которая имела незначительный успех, заключалась в доступе к базе данных Dashboard через REST. Он встроен, почему бы им не воспользоваться? Что ж, я смог манипулировать парой таблиц, но не той, которую хотел. Таким образом, в этой ситуации следует помнить о трех таблицах.

  1. узлы (в основном компьютеры)
  2. node_groups (группы, в которые вы можете поместить компьютеры)
  3. node_group_memberships (таблица соединений, которая связывает 1 и 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, и я даже могу создать модель Rails 3, которая не подходит для node_group_memberships, но я не могу ничего создать в этой таблице. Если я посмотрю на контроллер 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 жалких часов, пытаясь понять это. Спасибо!


person counterbeing    schedule 06.03.2012    source источник


Ответы (1)


Хорошо это или плохо, одна вещь, которая работает, — это подключение ко второй базе данных с тем же приложением Rails. Я пока оставлю это помеченным как «Ответ», но не «Ответ».

Это ресурс, который мне помог: http://www.rubynaut.net/articles/2008/05/31/how-to-access-multiple-database-in-rails.html

person counterbeing    schedule 07.03.2012