2009-07-18 3 views
0

레거시 데이터베이스 기반 Windows 앱에서 레일즈 앱으로 다소 큰 변환을 수행하고 있습니다. 많은 양식과 데이터베이스 테이블이 관련되어 있기 때문에 너무 멀리하기 전에 올바른 방법론을 갖고 있는지 확인하고 싶습니다.레일즈 앱을위한 방법론

내 관심사는 작성해야하는 코드의 양을 최소화하는 것입니다. 함께 상호 작용하는 많은 모델이 있으며, 내가 올바르게 사용하고 있는지 확인하고 싶습니다.

클래스 환자 < 액티브 :: 자료 has_many : PatientAddresses has_many : PatientFileStatuses 끝

클래스 PatientAddress < 액티브 :: 자료 belongs_to : 환자 끝

클래스 다음 모델의 단순화 된 세트입니다 PatientFileStatus < ActiveRecord :: Base belongs_to : 환자 끝

컨트롤러는 선택된 환자가 있는지를 결정합니다. 그 밖의 모든 것은 그것에 기초합니다.

보기에서 나는이 모델들 각각으로부터 데이터를 필요로 할 것이다. 하지만 내가 사용하고자하는 모든 속성에 대해 컨트롤러에 인스턴스 변수를 작성해야하는 것처럼 보입니다. 그래서 다음과 같이 코드를 작성 시작 :

@patient = 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": include_blank = "TRUE) %> : 포스 %>

(BTW, 선택, 예를 들어 ?해야/

  1. 내가 수동으로 컨트롤러의 모든 인스턴스 변수의 값을 선언해야합니까, 또는 할 수 있습니다; 태그가 정말 작동하지 않습니다 나는

    내 질문

    은) 내가 collection_select를 사용하는 것 같아요 나는 그 견해에서 그것을합니까?
  2. 기본 모델이 아닌 데이터의 선택 태그를 표시하는 적절한 기술은 무엇입니까?
  3. 이 양식의 변경 사항을 저장하려면 각 모델의 특성을 수동으로 선택하여 개별적으로 저장해야합니까? 아니면 ActiveRecord가 올바른 일을하도록 필드의 이름을 지정하는 방법이 있습니까?

미리 감사드립니다. Aaron.방금 대신 컨트롤러에 @patient_addresses을 정의하는, @patient.PatientAddresses를 작성할 수 있도록 뷰에서 임의의 루비 코드를 작성에서 당신을 중지 아무것도 없다

+0

귀하의 협회에서 낙타의 사례 표기법은 무엇입니까? –

답변

0

1) . 어쨌든 보일러 플레이트 일 뿐이며 나중에 변경하려는 경우 검색/교체로 리팩터링하기가 쉽습니다. OTOH 한 번만 룩업을 수행 할 때부터, 컨트롤러에 선

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

을 둘 것입니다 쿼리는 변경 될 수 있습니다.

3) ActiveRecordsave에있어서 약간 미묘하다. 일반적으로 메서드 과 종속성을 호출하는 개체 만 저장됩니다. 행 하나가 다른 테이블과 외래 키 관계를 가지고 있으면 하나의 행만 저장할 수 없습니다. 이 file_status.save를 호출 할 때 patient에 대한 id이 외래 키 관계를 생성해야하기 때문에 코드

patient = Patient.new; file_status.patient = patient

patient를 들어, 자동으로 저장 될 수 있다는 것을 의미한다. patient.save으로 전화하면 이 아니며file_status으로 저장됩니다.

Patient과 함께 연관된 오브젝트를 저장하려면 has_many 관계를 정의 할 때 :autosave => true을 지정할 수 있습니다.

세부 사항은 the docs입니다.

2

컨트롤러에서 모든 인스턴스 변수의 값을 수동으로 선언해야합니까, 아니면보기에서 할 수 있습니까?

일반적으로 어림짐작 할 때보기에서 인스턴스 변수를 정의하지 않아야합니다. 특히 모델에 대한 호출 인 경우. 유지 관리가 복잡하고 테스트하기가 더 어려우며 재사용 할 수 없습니다.

기본 모델이 아닌 데이터의 선택 태그를 표시하는 적절한 기술은 무엇입니까?

"보조"모델이 "기본"모델과 관련되어 있으면, 방법을 함께 연결할 수 있습니다. 모델에 연결을 정의하면 these methods for free이됩니다.

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

나는이 양식에 대한 변경 사항을 저장 이동 내가 직접 개별적으로 에게이를 각 모델 속성을 선택하고 저장해야합니다? 또는 필드에 이름을 지정하여 ActiveRecord가 올바른 작업을 수행하는 방법이 있습니까?

fields_for 관련 모델을 하나의 양식에 중첩하는 데 관심이 있습니다. Railscasts에는 양식의 관련 모델 작업에 대한 훌륭한 예제가 있습니다.

관련 문제