1

更新:我找到了一种可行的方法,尽管它不是很灵活,通过获取参数哈希并将其键与我的模型的列名进行比较。然后,我获取该名称数组并将其映射到一个散列,然后在我的 ActiveRecord 查询中使用该散列。一定会有更好的办法?

  def index
    if params
      hash = {}
      attributes = User.column_names & params.keys
      attributes.each do |attribute|
        hash.merge!(attribute.to_sym => params[attribute.to_sym])
      end
      @users = User.where(hash)
    else
      @users = User.all
    end
    respond_with @users
  end

背景:我已经将 Ember 应用程序连接到 Rails JSON API,并弄清楚了如何使用 Ember-Data 查询数据库。下面是 Coffeescript 中的一个示例:

App.UsersRoute = Ember.Route.extend
  model: ->
    # Step 1: Query database for all users
    @store.find('user')

    # Step 2: Filter results (keep male users named "Steve")
    @store.filter 'user', (user)->
      user.get('name') == "Steve" && user.get('gender') == "Male"

目标:我想知道这是否是解决此问题的最佳方法?随着用户数量的增加,查询所有用户不会变得越来越困难吗?

我在想一个很好的选择是将查询作为参数包含在我的初始查询中,如下所示:

@store.find 'user', {name: "Steve", gender: "Male"}
# Sends JSON request to /users.json?name=Steve&gender=Male

如果这是一种更好的方法,那么我对如何让 Rails 获取这两个参数并查询数据库感到困惑。下面是响应上述请求的 Rails 控制器:

class Api::V1::UsersController < ApplicationController
  respond_to :json

  def index
    respond_with User.all
  end
end

为了满足上述要求,我必须做这样的事情:

  def index
    respond_with User.where(name: params[:name], gender: params[:gender])
  end

但这不会容纳任何额外的查询,或者没有设置这两个参数的查询。这两种方法中哪一种最好?

4

1 回答 1

1

您可以尝试这样做,它允许您根据输入参数自定义 where 和其他子句:-

def index
    @user = User
if params[:name].present? && params[:gender].present?
    @user =  @user.where(name: params[:name], gender: params[:gender])
end

@user = @user.all
.....
  end
于 2013-09-12T10:46:55.370 回答