我正在尝试让我的 rails 3 应用程序使用如下所示的路线:
exampleapp.com/patients/123456
而不是
exampleapp.com/patients/1
其中“123456”将与患者的病历编号 ( :mrn
) 相关联,该编号已在:patients
表中并且是唯一整数。我想用:mrn
代替通常的:id
. 我该怎么办?
抱歉,如果这已经被问到 - 我找不到关于我正在尝试做的事情的术语。谢谢!
我正在尝试让我的 rails 3 应用程序使用如下所示的路线:
exampleapp.com/patients/123456
而不是
exampleapp.com/patients/1
其中“123456”将与患者的病历编号 ( :mrn
) 相关联,该编号已在:patients
表中并且是唯一整数。我想用:mrn
代替通常的:id
. 我该怎么办?
抱歉,如果这已经被问到 - 我找不到关于我正在尝试做的事情的术语。谢谢!
你可以这样做,
class Patient < ActiveRecord::Base
self.primary_key = "mrn"
end
但是,这会改变很多其他的事情。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
采用
match "/patients/:mrn" => "patients#show"
match "/patients/:mrn" => "patients#update", :via => :put
您可以将其添加到您的患者模型中
def class Patient < ActiveRecord::Base
self.primary_key = "mrn"
end
您可以通过在 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