Методология для приложения Rails - PullRequest
0 голосов
/ 18 июля 2009

Я предпринимаю довольно большое преобразование из устаревшего приложения Windows на основе базы данных в приложение Rails. Из-за большого количества форм и таблиц базы данных, я хочу убедиться, что у меня есть правильная методология, прежде чем идти слишком далеко.

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

класс Пациент

class PatientAddress

class PatientFileStatus

Контроллер определяет, выбран ли пациент; все остальное основано на этом.

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

@ пациент = Patient.find (сеанс [: пациент]) @patient_addresses = @ Patient.PatientAddresses @patient_file_statuses = @ Patient.PatientFileStatuses

@ enrollment_received_when = @patient_file_statuses [0] .EnrollmentReceivedWhen @consent_received = @patient_file_statuses [0] .ConsentReceived @consent_received_when = @patient_file_statuses [0] .ConsentReceivedWhen

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

Вид имеет комбинацию текстовых полей и полей выбора, чтобы отобразить данные выше. Например:

"val1", "val2" => "val2", "Written" => "Written"},: include_blank => true)%> : force%>

(Кстати, тег select на самом деле не работает; думаю, я должен использовать collection_select?)

Мои вопросы:

  1. Должен ли я вручную объявлять значение каждой переменной экземпляра в контроллере, или я могу / должен ли я сделать это в представлении?
  2. Как правильно отображать тег выбора для данных, которые не являются основной моделью?
  3. Когда я сохраню изменения в этой форме, придется ли мне вручную выбирать атрибуты для каждой модели и сохранять их отдельно? Или есть способ назвать поля так, что ActiveRecord делает правильные вещи?

Заранее спасибо, Аарон.

Ответы [ 2 ]

2 голосов
/ 18 июля 2009

Должен ли я вручную объявлять значение каждой переменной экземпляра в контроллере, или я могу / должен ли я сделать это в представлении?

Как общее практическое правило, вам следует избегать определения переменных экземпляра в ваших представлениях; особенно если это вызов модели. Это может быть сложным в обслуживании, более трудным для тестирования и не может быть повторно использовано.

Как правильно отображать тег выбора для данных, которые не являются основной моделью?

При условии, что «вторичные» модели связаны с «первичной» моделью, вы можете объединять методы в цепочку. Когда вы определите ассоциацию в своей модели, вы получите эти методы бесплатно .

# Where attr is an attr belonging to the patient_address which is 
# associated with the patient
<%= @patient.patient_address.attr %>

Когда я иду, чтобы сохранить изменения в этом Форма, я должен буду выбрать вручную атрибуты для каждой модели и сохранить их индивидуально? Или есть способ назвать поля так, чтобы ActiveRecord делает правильные вещи?

Вас заинтересует метод fields_for для вложения связанных моделей в одну форму. Railscasts также имеет несколько замечательных примеров работы со связанными моделями в формах.

0 голосов
/ 18 июля 2009

1) Ничто не мешает вам писать произвольный код Ruby в представлении, поэтому вы можете просто написать @patient.PatientAddresses вместо определения @patient_addresses в контроллере. В любом случае, это всего лишь базовая информация, и ее очень легко изменить с помощью поиска / замены, если вы захотите изменить ее позже. OTOH я бы поставил строку

@patient = Patient.find(session[:patient])

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

3) Метод save в ActiveRecord немного тонкий. Как правило, он будет сохранять только объект, для которого вы вызываете метод , а также любые зависимости . Может быть невозможно сохранить только одну строку, если эта строка имеет отношение внешнего ключа к другой таблице. Это означает, что для кода

patient = Patient.new; file_status.patient = patient

patient будет автоматически сохраняться при вызове file_status.save, так как id для patient должно быть сгенерировано для отношения внешнего ключа. Вызов patient.save будет не сохранить file_status однако.

Если вы хотите, чтобы связанные объекты были сохранены вместе с Patient, вы можете указать :autosave => true при определении отношения has_many.

Подробности в документах .

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