0

すべての顧客の詳細を表示できるページ、またはパラメーターで指定されている場合は1 人の顧客の詳細のみを表示できるページがあります。

私のコントローラーはこんな感じです。

def display_customers
  @all_customers = Customer.all
  if params[:customer_id]
    @customers = Customer.find(:all, conditions: ["id = ?", params[:customer_id]])
  else
    @customers = @all_customers
  end
end

@all_customersは顧客のドロップダウンを設定するために使用します。
私は、顧客ごとにループ@customersを実行していました。 次に、パラメーターが指定されている場合は、単一の顧客になります。each
customer_id@customers

これは問題なく機能します@customers = Customer.find(...)が、追加の DB クエリです。
私はすでにすべての顧客を持っている@all_customersので、DB に戻るのではなく、そこから必要な 1 つのレコードを取得するためのより良い方法があると思います。

4

2 に答える 2

0

findすべての Enumerables に組み込まれている を使用できます...

if params[:customer_id]
  @customer = @all_customers.find { |c| c.id == params[:customer_id] }
else
  #...

...しかし、おそらくそうすべきではありません。

レコードの数によっては、上記のコードが返されたすべてのレコードに対して線形検索を使用するデータベース クエリでインデックスが使用されるため、これ以上速くならない場合があります。おそらく、2 番目のデータベース クエリが最適です。

また、クエリを書き直す必要があります。Rails は非常にスマートなので、ID でレコードを検索するときに条件を渡す必要はありません。あなたはそれを見つけるだけです。これらは同一です:

# BAD:
@customers = Customer.find(:all, conditions: ["id = ?", params[:customer_id]])

# BETTER:
@customers = Customer.find_by_id(params[:customer_id])

# BEST:
@customer = Customer.find(params[:customer_id])

本当に配列にしたい場合は、結果を でラップするだけ[]です。

于 2013-03-28T17:34:28.810 に答える
0

これはどう

def display_customers
  @all_customers = []
  if params[:customer_id].empty?
    @all_customers = Customer.all
  else 
    @all_customers << Customer.find(params[customer_id])
  end
  @all_customers
end

こちらです

" " クエリは、 paramselect * from customersがない場合にのみ実行されます(常にではありません)。customer_idDBからすべてを選択してフィルタリングするよりも効率的だと思います

于 2013-03-28T22:15:25.753 に答える