Как мне получить доступ к моей базе данных rails из задачи в lib / tasks? - PullRequest
6 голосов
/ 04 апреля 2009

Я занимаюсь разработкой приложения, которое должно отправлять текстовые сообщения, поэтому информация о носителе хранится в базе данных. Мне также нужна эта информация в XML-файле для чтения на стороне клиента. Чтобы это произошло, я пишу скрипт, который считывает информацию о носителе из БД и создает файл XML в каталоге config. Я чувствовал, что этот скрипт лучше всего подходит для lib / tasks.

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

db = Mysql.new("domain", "username", "password", "database")

Мне придется хранить несколько версий для разных сред, потому что я не использую MySQL все время. Это было бы очень небрежно. Я уверен, что есть способ сделать это. Я пытался просто получить доступ к объекту ... вот что у меня есть:

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../.."))
RAILS_CONFIG = "#{RAILS_HOME}/config"

f = File.new("#{RAILS_CONFIG}/mls_widget_config.xml", "w")
carriers = Carrier.find_all
f.write carriers
f.close

Но Перевозчик не определен, что имеет смысл. Как я могу дать этому сценарию доступ к объекту Carrier в БД?

Кроме того, если кто-то знает, как легко преобразовать то, что я прочитал из БД, в правильный XML, это было бы здорово. Я собирался написать что-то особенное очень быстро.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 04 апреля 2009

Вы можете включить задачу Rake для доступа к вашим моделям, определив вашу задачу следующим образом:

task :my_task => :environment do
  # Task code
end

Обратите внимание на => :environment, который предоставляет этот доступ. Затем вы можете поручить вашей задаче Rake использовать различные среды следующим образом:

rake RAILS_ENV=development my_task
rake RAILS_ENV=production my_task

Что касается сериализации XML, вы можете использовать встроенный метод to_xml, например:

Carrier.all.to_xml

Обратите внимание, что метод .all является недавним дополнением к Rails и является псевдонимом для .find(:all).

2 голосов
/ 04 апреля 2009

По соглашению lib / tasks обычно резервируется для задач rake - вы можете захотеть поместить код своей библиотеки в ее собственную директорию. может быть lib / messaging?

Вы используете старую версию Rails? find_all не работает в последних версиях: «find (: all)» или просто «all» в настоящее время являются методами.

File.new("#{RAILS_ROOT}/mls_widget_config.xml", "w") do |f|
  Carrier.all.each { |carrier| f.puts carrier.to_xml }
end
2 голосов
/ 04 апреля 2009

Вы на самом деле почти там; Я бы просто порекомендовал, чтобы ваша среда Rails была частью скрипта, например:

RAILS_HOME = File.expand_path(File.join(File.dirname(__FILE__),"../.."))
RAILS_CONFIG = "#{RAILS_HOME}/config"
require "#{RAILS_CONFIG}/environment"

Теперь у вас должен быть доступ ко всей структуре вашего домена. Rails также включает сериализацию XML по умолчанию с помощью вызова метода to_xml; попробуйте Carrier.find(:all).to_xml.

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