Рефакторинг Rails: куда бы вы поместили хеш, который отображает поля одной таблицы в другую - PullRequest
0 голосов
/ 07 января 2011

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

FieldMappings = {
  :name_last => :last_name,
  :name_first => :first_name,
  :calculated_field => lambda {|external_person| ... },
  ...
}

Но где бы вы поместили этот хэш?Естественно ли помещать его в класс External :: Person, потому что единственная причина, по которой мы получаем доступ к этим записям, заключается в выполнении этой инициализации?Или это будет идти в контроллере?Или помощник?

Добавлено: Использование Rails 2.3.5.

Ответы [ 4 ]

1 голос
/ 07 января 2011

Я бы поместил этот код в External :: Person, чтобы избежать Person, даже не зная, что он существует. Используйте метод to_person (или, может быть, to_internal_person) для External :: Person. Сохраните хэш в External :: Person и используйте его для генерации. В любом случае, как говорит JacobM, вам нужен этот код в вашей модели, а не контроллер.

class PeopleController < ApplicationController
  def new
    if external = External::Person.find_by_id params[:external_id]
      @person = external.to_person
    else
      @person = Person.new
    end
  end
end
0 голосов
/ 08 января 2011

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

module UserMapping
  FIELDS = { :last_name => :name_last, .... }
end

Если вы уронили модуль на lib и используете rails 3, вы должны поместить этов вашем config/application.rb файле:

config.autoload_paths += %W(#{config.root}/lib)

Вкл. Rails::VERSION::MAJOR < 3 каталог lib автоматически добавляется в autoload_path

0 голосов
/ 07 января 2011

Прежде всего, я бы выполнил эту работу в вашей (внутренней) модели Person - предоставил ей метод класса, такой как create_person_from_external_person, который принимает внешнего человека и выполняет назначения.

Учитывая это, я думаю, что было бы хорошо включить хеш в эту модель Person или где-то еще, как предлагает Джош. Что было бы особенно здорово, так это написать общий метод create_person_from_external_person, который запрашивал бы у внешнего человека хеш, а затем выполнял сопоставление на основе этого хеша; Такой подход может поддерживать более одного типа внешнего человека. Но это может быть излишним, если вы знаете, что это единственный тип, с которым вам приходится иметь дело.

Я бы не поместил его в контроллер, но, опять же, я бы не стал выполнять эту работу и в контроллере.

0 голосов
/ 07 января 2011

Если вы находитесь в Rails 3.x (возможно, также в 2.x, я не уверен), вы можете поместить разные классы и модули в папку /extras, которая включена в путь автозагрузчика.Здесь я всегда помещаю вещи такого рода, но я не знаю ни одного соглашения Rails для такого рода вещей.

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