更新:我找到了一种方法,虽然它不是很灵活,但是使用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
但是这不能容纳任何其他查询,或者没有设置这两个参数的查询。这两种方法中哪一种最好?
答案 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