2 つの日付の間のすべてのオブジェクトを返す単純な Rails API を作成しました。Rails コンソールでは、データベースは 1 回だけクエリされますが、API は同じリクエストに対して複数のクエリを引き起こします。
これはコントローラーメソッドです:
def historic_returns
respond_to do |format|
format.json do
start_date = Date.new(params[:start_year].to_i, params[:start_month].to_i)
end_date = Date.new(params[:end_year].to_i, params[:end_month].to_i)
@result = ShillerDataMonth.records_between_two_dates(start_date, end_date)
render :json => @result
end
end
end
これは、コントローラーが使用するモデルのクラス メソッドです。
def self.records_between_two_dates(start_date, end_date)
ShillerDataMonth.where("record_date >= ? AND record_date <= ?", start_date, end_date).order("record_date asc")
end
Rails コンソールで ShillerDataMonth#records_between_two_dates メソッドを実行すると、予想どおり、データベース クエリは 1 つしかありません。
>> ShillerDataMonth.records_between_two_dates(Date.new(2010, 01), Date.new(2012, 01))
ShillerDataMonth Load (2.2ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE (record_date >= '2010-01-01' AND record_date <= '2012-01-01') ORDER BY record_date asc
ただし、localhost /historic_returns.json?start_year=2010&start_month=1&end_year=2012&end_month=1 でこのパスにアクセスすると、複数のクエリがあります。
Started GET "/historic_returns.json?start_year=2010&start_month=1&end_year=2012&end_month=1" for 127.0.0.1 at 2013-07-08 20:44:34 -0400
Processing by ShillerDataMonthsController#historic_returns as JSON
Parameters: {"start_year"=>"2010", "start_month"=>"1", "end_year"=>"2012", "end_month"=>"1"}
ShillerDataMonth Load (2.1ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE (record_date >= '2010-01-01' AND record_date <= '2012-01-01') ORDER BY record_date asc
ShillerDataMonth Load (0.6ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2009.12' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2009.12' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2009.12' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2009.12' LIMIT 1
ShillerDataMonth Load (0.6ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.01' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.01' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.01' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.01' LIMIT 1
ShillerDataMonth Load (0.8ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.02' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.02' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.02' LIMIT 1
CACHE (0.0ms) SELECT "shiller_data_months".* FROM "shiller_data_months" WHERE "shiller_data_months"."year_month" = '2010.02' LIMIT 1
...これが毎月続きます....
API に複数のリクエストがあるのはなぜですか? どうすれば修正できますか?助けてくれてありがとう!