在Rails中使用动态参数进行查找

时间:2016-10-31 10:35:51

标签: ruby-on-rails activerecord rails-activerecord

在我的Rails 5应用程序中,我需要能够根据从第三方应用程序发送的传入params[:id]值的类型来查找数据。每个模型都有两个唯一标识符:idcuid,收到的值可以是其中之一。问题很容易说明如下:

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并不能解决问题。

1 个答案:

答案 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