Rails按任意列查询

时间:2014-10-18 10:06:11

标签: ruby-on-rails

在我的Rails API / Angular应用程序中,我希望能够使用字段值搜索Rails表。我目前的代码如下所示,它允许通过电子邮件ID搜索用户表,并将用户记录作为JSON返回。

API /控制器/ users_controller.rb

def query  # by email
  queried_user = User.where(email: params[:email]).first
  if !queried_user.nil?
    render json: queried_user, root: false
  else
    render json: {error: 'Does not exist'}, status: :not_found
  end
end

配置/ routes.rb中

get 'api/users/:id/query' => 'api/users#query'

示例网址

http://0.0.0.0:8080/api/users/1/query?email=testuser1@example.com

示例返回JSON

{"id":14,"title":"Dr.","first_name":"John","last_name":"Smith","email":"testuser1@example.com","job_title":"Head Bioligist","organisation":"NIH","phone_office":null,"city":null,"country":null,"approved":true,"admin":false,"template":false}

目前一切正常,但有两个问题无法解决。

  1. 我希望网址不包含:id 我发现当我将网址从网址中删除时,Rails会将查询参数视为ID。我可以通过硬编码假身份证来使其工作,但它对我来说似乎不是正确的答案。

  2. 我想将一个健康的参数哈希传递给查询方法。它应该根据哈希内容映射列。

  3. 如果 params = {email:' testuser1@example.com'} 那么它应该像现在一样工作,但其他所需的选项可能是:

    {job_title: 'Manager'}
    {city: 'LA', last_name: 'Smith'}
    

    我希望我会更改此代码,但不知道如何将任意元素传递到where。

    queried_user = User.where(email: params[:email])
    

1 个答案:

答案 0 :(得分:1)

where方法可以接受哈希,因此您可以传递包含查询条件的param哈希。请注意,将哈希传递给where方法时,只能使用相等和范围条件。请确保您的应用程序的安全性受到保护。例如:

queried_user = User.where(params[:user])

要删除路径文件中的:id,请定义类似于此的新路由:

match 'api/users/query', to: 'users#query', as 'user_search'

然后使用' user_search_path'用于将搜索发送到用户控制器的查询操作。