2012-05-16 2 views
1

내가 좋아하는 뭔가 보이는 경로를 사용하여 내 레일 3 응용 프로그램을 얻으려고 :사용 변수 기타 : 레일의 ID 3 개 루트

exampleapp.com/patients/123456 

보다는

exampleapp.com/patients/1 

" 123456 "은 환자의 의료 기록 번호 (:mrn)와 연관되어 있으며 이는 이미 :patients 테이블에 있으며 고유 한 정수입니다. 평소에 :id 대신 :mrn을 사용하고 싶습니다. 나는 이것에 대해 어떻게 갈 것인가?

죄송합니다. 이미 물어 본 경우 - 내가하고 싶은 말을 찾을 수 없습니다. 감사!

답변

5

당신은

class Patient < ActiveRecord::Base 
    self.primary_key = "mrn" 
end 

그러나, 이것은 다른 것들의 무리가 변경됩니다, 당신의 환자 모델

def class Patient < ActiveRecord::Base 
    self.primary_key = "mrn" 
end 
+0

감사합니다. RadBrad. 컨트롤러에서 내가했다면 아무것도 바꿔야합니까? 분명히 아닙니다! 감사! – oort

+0

아, 한 가지가 있습니다. 'mrn'을 primary_key로 설정하면 나중에 편집 할 수 없다는 의미입니까? 내 스펙 테스트는 환자 레코드에서 'mrn'을 편집하려고 할 때 문제가 발생합니다. 해결 방법이 있습니까? 아니면 피할 수없는 일입니까? – oort

+0

은 꽤 투명하지 않아야합니다. 어떻게 보입니까? – RadBrad

6

당신이 할 수있는이를 추가 할 수 있습니다. to_params는 mrn을 사용합니다. 컨트롤러는 여전히 params [ "id"]를 사용하지만 값은 mrn 필드가됩니다. Patient.find 메서드는 mrn 필드에서는 작동하지만 id 필드에서는 작동하지 않습니다. (사용자는 지정된 필드에서 작동하는 Patient.find_by_mrn 및 Patient.find_by_id를 사용할 수 있습니다.) 또한 모든 외래 키는 mrn 값이됩니다.

mrn 필드를 편집 할 수 있으며 id 필드가있는 경우 (해제하지 않는 한) 모든 외래 키가 수정되어야하므로 편집이 어려울 수 있습니다. 그냥

resources :patient 

사용하는 대신 설정/routes.rb 파일에 다음

match "/patients/:mrn" => "patients#show" 
match "/patients/:mrn" => "patients#update", :via => :put 
1

을 URL을 변경하려는 경우

또는, 당신은 별 자원 식별자 정의에 의해 얻을 수 있습니다 Resource 인스턴스에서 member_scope 및 nested_scope 메소드를 재정의합니다.

resources :patients do 
    @scope[:scope_level_resource].tap do |u| 
    def u.member_scope 
     "#{path}/:mrn" 
    end 

    def u.nested_scope 
     "#{path}/:#{singular}_mrn" 
    end 
    end 
end