Ruby on rails CRUDL-使用id以外的参数访问ROR项

Ruby on rails CRUDL-使用id以外的参数访问ROR项,ruby-on-rails,asp.net-web-api,rails-activerecord,Ruby On Rails,Asp.net Web Api,Rails Activerecord,我正在为设备设计一个Web API和一个本地数据库。这些数据库有时进行通信。因为每个数据库中的项都有不同的主键,所以我需要使用其他参数从另一个数据库中搜索一个数据库 我知道在ROR中使用where,但我需要知道在外部传递请求时如何对CRUDL请求建模 例如,如果我想从Web API中删除一个项目,该项目具有与本地数据库SKU匹配的特定SKU编号,那么我希望将我的请求编写为 删除http://webapiaddress.com/items/912094810 其中912094810是SKU 在我的

我正在为设备设计一个Web API和一个本地数据库。这些数据库有时进行通信。因为每个数据库中的项都有不同的主键,所以我需要使用其他参数从另一个数据库中搜索一个数据库

我知道在ROR中使用
where
,但我需要知道在外部传递请求时如何对CRUDL请求建模

例如,如果我想从Web API中删除一个项目,该项目具有与本地数据库SKU匹配的特定SKU编号,那么我希望将我的请求编写为
删除http://webapiaddress.com/items/912094810
其中
912094810
是SKU

在我的item controller中,我尝试了以下操作

 def destroy
      @item = Item.where(sku: params[:sku]).first
      @item.destroy
 end
但是如果我调用
DELETEhttp://webapiaddress.com/items/912094810
,我得到一个404错误


有什么建议吗?

您需要为
项设置自定义主键

要做到这一点,请在您的
routes.rb中包含以下内容:

resources :items, param: :sku
在您的
项目中
型号:

self.primary_key = 'sku'
您还需要为
表指定自定义主键,如下所示:

create_table :item, id: false do |t|
  t.primary_key :sku
end

或者根据您目前的设置进行其他操作

这样,您就可以使用
sku
而不是
id
项目进行CRUD。您也不需要
where
来选择记录。普通的旧
find
方法可以与自定义主键配合使用,因此您可以使用:

Item.find(params[:sku])

您需要为
表设置自定义主键

要做到这一点,请在您的
routes.rb中包含以下内容:

resources :items, param: :sku
在您的
项目中
型号:

self.primary_key = 'sku'
您还需要为
表指定自定义主键,如下所示:

create_table :item, id: false do |t|
  t.primary_key :sku
end

或者根据您目前的设置进行其他操作

这样,您就可以使用
sku
而不是
id
项目进行CRUD。您也不需要
where
来选择记录。普通的旧
find
方法可以与自定义主键配合使用,因此您可以使用:

Item.find(params[:sku])

谢谢不过,我的
项目
模型似乎无法识别
自我
。知道为什么吗?不知道。您收到了什么错误消息?或者你认为有帮助的其他细节?对不起。我对RoR很陌生。我只知道我的
项。rb
模型现在包含这个
类项
,但“self”在Cloud9(我的RoR IDE)中高亮显示为红色,好像它不识别关键字
self
不确定Cloud9及其高亮显示,但是,
self.primary_键
肯定会起作用,而且似乎您添加它的方式是正确的。也许你可以键入
self.primary\u key='id'
,而只是尝试运行你的应用程序,检查它是否有效。我不确定它是什么。这也不起作用-只有
self
不被识别。谢谢!不过,我的
项目
模型似乎无法识别
自我
。知道为什么吗?不知道。您收到了什么错误消息?或者你认为有帮助的其他细节?对不起。我对RoR很陌生。我只知道我的
项。rb
模型现在包含这个
类项
,但“self”在Cloud9(我的RoR IDE)中高亮显示为红色,好像它不识别关键字
self
不确定Cloud9及其高亮显示,但是,
self.primary_键
肯定会起作用,而且似乎您添加它的方式是正确的。也许你可以键入
self.primary\u key='id'
,而只是尝试运行你的应用程序,检查它是否有效。我不确定它是什么。这也不起作用——只有
self
无法识别。