更新:我找到了一种可行的方法,尽管它不是很灵活,通过获取参数哈希并将其键与我的模型的列名进行比较。然后,我获取该名称数组并将其映射到一个散列,然后在我的 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
但这不会容纳任何额外的查询,或者没有设置这两个参数的查询。这两种方法中哪一种最好?