2

Rails REST サービスをセットアップしましたが、単一のレコードを表示する際に問題が発生しています。ヒットしようとしている URL は次のとおりです。

http://website:3000/users/2/timesheets/21

コントローラーコード:

  def show
    puts "SHOW"
    puts params.inspect
    @timesheets = User.find(params[:user_id]).timesheets(params[:id])

    respond_to do |format|
      format.json { render json: @timesheets }
    end
  end

パラメータがコントローラーに到達していることは知っていますが、:timesheet_id. 私が何を意味するかを示すコンソール出力は次のとおりです。

Started GET "/users/2/timesheets/21" for **.**.***.** at 2013-03-19 06:12:11 -0400
Processing by TimesheetsController#show as */*
  Parameters: {"user_id"=>"2", "id"=>"21"}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "2"]]
  Timesheet Load (0.5ms)  SELECT "timesheets".* FROM "timesheets" WHERE "timesheets"."user_id" = 2
Completed 200 OK in 120ms (Views: 36.5ms | ActiveRecord: 2.9ms)

パラメーター ハッシュに 21 のタイムシート ID が表示されます。次に、ユーザーを取得するためのクエリが作成されますが、そのユーザーのすべてのタイムシートが取得されます。どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

4

Prakash の提案は機能しますが、2 つのクエリを実行します。1 つはユーザーを取得するためのもので、もう 1 つはタイムシートを取得するためのものです。User.find(...)最初に行う理由はないようです。timesheets テーブルのみをクエリすることもできます。これは、1 つのクエリのみを実行するため、より高速です。

@timesheet = Timesheet.where('user_id = ? and id = ?', params[:user_id], params[:id]).first
于 2013-03-19T14:04:39.507 に答える
1

これを試して:

@user = User.find(params[:user_id])
@timesheet = @user.timesheets.find(params[:id])

これにより、次のようにクエリが実行されます。

SELECT "timesheets".* FROM "timesheets" WHERE "timesheets"."id" = 21 AND ("timesheets"."user_id" = 2) LIMIT 1

対応するビューは、@timesheet変数ではなく変数を参照する必要があり@timesheetsます。

于 2013-03-19T13:52:16.693 に答える