в Rails, как выполнить прямой код SQL для другой базы данных? - PullRequest
4 голосов
/ 17 сентября 2008

Вот случай.

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

Базы данных, к которым мне нужно подключиться, не известны во время разработки (т. Е. Я не могу поместить их данные в database.yaml). Скорее, у меня есть модель 'database_details', которую пользователь будет использовать для ввода сведений о базах данных, по которым приложение будет выполнять запросы во время выполнения.
Таким образом, соединение с этими базами данных действительно динамическое, а детали решаются только во время выполнения.

Как я могу это сделать?

Спасибо
Ролло

Ответы [ 3 ]

9 голосов
/ 17 сентября 2008

Вы можете программно установить соединение, используя такой вызов

ActiveRecord::Base.establish_connection(
   :adapter  => "mysql",
   :host     => "localhost",
   :username => "myuser",
   :password => "mypass",
   :database => "somedatabase"
)

Как видите, вы можете заменить somedatabase значением database_model.database_name. то же самое с адаттером и все

ActiveRecord :: Base.establish_connection документация

Тогда вы можете использовать

ActiveRecord::Base.find_by_sql("select * ") 

чтобы выполнить ваш sql запрос.

ActiveRecord :: Base.find_by_sql документация

Мистер Мэтт был прав, если не окончен

Дополнительную информацию (устаревшую, но полезную для подхода к проектированию) можно найти здесь и не забудьте подключиться к обычной базе данных, когда вы закончите:)

6 голосов
/ 17 сентября 2010

У меня была такая ситуация, когда мне приходилось подключаться к сотням разных экземпляров внешнего приложения, и я делал код, подобный следующему:

  def get_custom_connection(identifier, host, port, dbname, dbuser, password)
      eval("Custom_#{identifier} = Class::new(ActiveRecord::Base)")
      eval("Custom_#{identifier}.establish_connection(:adapter=>'mysql', :host=>'#{host}', :port=>#{port}, :database=>'#{dbname}', " +
      ":username=>'#{dbuser}', :password=>'#{password}')")  
    return eval("Custom_#{identifier}.connection")
  end

Это дает дополнительное преимущество, заключающееся в том, что вы не меняете соединение ActiveRecord :: Base, от которого наследуются ваши модели, так что вы можете запускать SQL для этого соединения и отбрасывать объект, когда закончите.

0 голосов
/ 17 сентября 2008

Вы можете сделать это через self.establish_connection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...