1

更新: 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つのアプローチのどちらが最適ですか?

4

1 に答える 1