在我的Rails 5应用程序中,我需要能够根据从第三方应用程序发送的传入params[:id]
值的类型来查找数据。每个模型都有两个唯一标识符:id
和cuid
,收到的值可以是其中之一。问题很容易说明如下:
if params[:id][/^\d+$/] # if it is numeric
@shipment = Shipment.find(params[:id])
elsif params[:id].present?
@shipment = Shipment.find_by_cuid(params[:id])
end
在路由中,我必须定义用于查找的参数,例如:
resources :shipments, param: :cuid
但是如果我需要能够根据数据类型在两个列中动态查找(并且是的,我知道传入类型默认情况下将始终为字符串),那么ofc并不能解决问题。
答案 0 :(得分:0)
我最终在application_record.rb
中定义了一个全局范围,其中包含以下内容:
scope :get_by_id_or_cuid, -> (id) do
id.to_i.to_s == id.to_s ? find(id) : find_by_cuid(id)
end
因此,从现在开始,我会拨打get_by_id_or_cuid
而不是find_by_id
。