如何查询数据库和过滤结果(Ember.js + Rails)

时间:2013-09-12 10:22:33

标签: ruby-on-rails json ruby-on-rails-3 ember.js ember-data

更新:我找到了一种方法,虽然它不是很灵活,但是使用params哈希并将其键与我模型的列名进行比较。然后我获取该名称数组并将其映射到哈希,然后我在我的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

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

1 个答案:

答案 0 :(得分: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