2012-02-11 2 views
0

Я написал небольшой метод для запроса и получения с сервера MS SQL 2008, и я не уверен, куда поместить код в моем приложении rails.Где и как я должен добавить этот новый метод «не-rails-way» в моем приложении Rails

Сценарий:
Я пишу приложение на Ruby и Rails с подключением к наследию MS SQL 2008 сервер БД. Много работает как ожидалось, что приятно. На данный момент я отлаживаю копию старой базы данных, и я рассматриваю ее как только для чтения. Он большой (7000+ таблиц, некоторые из которых имеют более 40 миллионов записей). Я использую его как «как есть» и не хочу изменять какую-либо базовую схему.

Я хочу расширить некоторые специфические для сервера функции. Например, я использую:

thing = ActiveRecord::Base.connection.exec_query(my_query_string_here) 

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

thing[0][""] 

... который работает.

Итак, я думал, что я должен написать метод, чтобы сделать это легче, и я написал:

Class Tool < ActiveRecord::Base 
    def self.queryRDW(x) 
    res=ActiveRecord::Base.connection.exec_query(x) 
    ret=res.to_hash 
    return ret[0][""] 
    end 
end 

и поместить его в конфиге/инициализаторах/tool.rb К сожалению, WEBrick жалуется на файл во время загрузки с следующие загадочные ошибки:

.../config/initializers/tool.rb:7: syntax error, unexpected keyword_end, expecting $end (SyntaxError) 

Я признаю, что это не вне коробки рельсы-способ делать вещи, поэтому, пожалуйста, не напоминай мне. (Моя борьба напоминает мне достаточно часто)

Моим вопрос:
Где я должен поставить этот код, чтобы я мог вызывать его изнутри контроллера или представлений в моих рельсах приложении? Должен ли это быть новый метод класса или что-то еще?

Большое спасибо!

Добавление:
я изменил класс для класса (! DOH)
я переехал tool.rb в Lib/
Я изменил tool.rb сих пор быть:

module Tool 
    def self.queryRDW(x) 
    res = ActiveRecord::Base.connection.exec_query(x) 
    res.to_hash[0][""] 
    end 
end 

но делает это в app/views/stats.html.erb

thing=queryRDW("mysql string") 

получает мне 'Неизвестная ошибка метода'

Addendum 2
Я сделал приложение/проблемы с каталогом и поместил tool.rb там.
Когда я использую:

<%=queryRDW("myStringHere")%> 

в:

app/views/stats.html.erb 

я получаю:

undefined method `queryRDW' for #<#<Class:0x0000000378ccf8>:0x00000003c1ce58> 

ответ

4

Вы должны строчные буквы ключевого слова class в строке 1.

Я бы также сказать, что этот класс не нужно наследовать от ActiveRecord::Base - и даже не очень нужно быть классом - если это просто обертка вокруг exec_query. Там нет ничего «плохого» с этим, но если вы никогда не намерены создать объект этого класса, вы могли бы просто создать простую утилиту модуль:

module Tool 
    def self.queryRDW(x) 
    res = ActiveRecord::Base.connection.exec_query(x) 
    res.to_hash[0][""] 
    end 
end 

Вы можете сохранить этот файл в нескольких местах:

  1. lib/tool.rb. Если вы используете Rails 3, вам нужно добавить (или раскомментировать) эту строку в config/application.rb:

    # config/application.rb 
    config.autoload_paths += %W(#{config.root}/lib) 
    
  2. app/concerns/tool.rb. Это будет автоматически обнаружено Rails 3.

Я обычно использую app/concerns для инструментов, которые полностью конкретных приложений и lib за коммунальные услуги, которые я мог бы использовать повторно из нескольких различных приложений.

+0

omg. Благодарю. Это фиксировало «неожиданное ключевое слово_енд», и начинается webrick. Теперь, когда я пытаюсь вызвать queryRDW в представлении, я получаю undefined метод 'queryRDW 'для # <# <Класс: 0x000000036b75d0>: 0x00000003632718> Какой синтаксис я должен использовать? –

+0

Я не видел этот комментарий, пока не обновил свой ответ. Можете ли вы изменить свой вопрос и добавить код в представление, которое генерирует эту ошибку? – Brandan

+0

Готово. Спасибо, что помогли мне здесь. –

2

Я бы не ставил это в config/initializers. Это похоже на код, который вы указали в app/models.

Ошибка, которую вы получаете, связана с синтаксисом, поэтому дважды проверьте синтаксис.

Чтобы ответить на ваш вопрос более прямо, однако, это приемлемо для размещения этого материала в вашей модели, если это связано с моделью (другими словами, частью вашего бизнес-домена). Если это что-то постороннее или ортогональное для вашего домена, я бы поместил его в lib.

Надеюсь, это поможет.

+0

Вы хотите, чтобы файл tool.rb был перемещен в приложение/модели? С каким синтаксисом вы тогда вызываете queryRDW()? –

+0

Да, это кажется уместным. Кроме того, если этот класс фактически не моделирует реальную таблицу Active Record, я бы просто сделал ее простым рубиновым объектом внутри 'app/models'. Насколько вы его вызывали, я не уверен, что понимаю вопрос ... вы бы справились с ним, как с любым другим объектом. Можете ли вы опубликовать несколько подробностей о том, как вы пытаетесь его использовать? –

+0

Спасибо, Бен. Теперь я понимаю, что создание этого класса, вероятно, неверно. Нет таблицы инструментов или инструментального объекта как такового. –

Смежные вопросы