更新: 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 にこれら 2 つのパラメーターを取得させ、それらをデータベースに照会させる方法に困惑しています。以下は、上記のリクエストに応答する 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
ただし、これは追加のクエリ、またはこれらのパラメーターの両方が設定されていないクエリには対応しません。これら2つのアプローチのどちらが最適ですか?