Где и как мне добавить этот новый метод, не относящийся к рельсам, в моем приложении Rails - PullRequest
0 голосов
/ 12 февраля 2012

Я написал небольшой метод для запроса и получения с сервера MS SQL 2008, и я не уверен, куда поместить код в моем приложении 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 

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

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

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

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

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

Добавление:
Я изменил класс на класс (дох!)
Я переместил 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")

возвращает мне 'неопределенную ошибку метода'

Приложение 2
Я создал каталог app / Concerns и поместил там файл tool.rb.
Когда я использую:

<%=queryRDW("myStringHere")%>

в:

app/views/stats.html.erb

Я получаю:

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

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

Вам нужно прописать ключевое слово 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 для утилит, которые я мог бы повторно использовать среди нескольких различных приложений.

2 голосов
/ 12 февраля 2012

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

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

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

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