在rails 3路由中使用除以下内容之外的变量:id

oor*_*ort 1 routes ruby-on-rails

我正在尝试让我的rails 3应用程序使用类似于以下内容的路由:

exampleapp.com/patients/123456
Run Code Online (Sandbox Code Playgroud)

而不是

exampleapp.com/patients/1
Run Code Online (Sandbox Code Playgroud)

其中"123456"将与患者的医疗记录编号(:mrn)相关联,该编号已在:patients表格中并且是唯一的整数.我想用:mrn代替平常的:id.我该怎么做?

对不起,如果已经被问过 - 我找不到关于我正在尝试做什么的术语.谢谢!

Mar*_*rce 6

你可以这样做,

class Patient < ActiveRecord::Base
  self.primary_key = "mrn"
end
Run Code Online (Sandbox Code Playgroud)

但是,这将改变一堆其他的东西.to_params将使用mrn.控制器仍将使用params ["id"],但该值将是mrn字段.Patient.find方法适用于mrn字段,但不适用于id字段.(您可以使用Patient.find_by_mrn和Patient.find_by_id来处理它们指定的字段.)此外,所有外键都将是mrn值.

您可以编辑mrn字段,并且您仍然会有一个id字段(除非您将其关闭),但编辑可能会很麻烦,因为所有外键都必须更正.

或者,如果您只想更改URL,则在config/routes.rb文件中而不是

resources :patient
Run Code Online (Sandbox Code Playgroud)

使用

match "/patients/:mrn" => "patients#show"
match "/patients/:mrn" => "patients#update", :via => :put
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以将其添加到您的患者模型中

def class Patient < ActiveRecord::Base
  self.primary_key = "mrn"  
end
Run Code Online (Sandbox Code Playgroud)