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 的建议可行,但会执行两个查询:一个是获取用户,另一个是获取时间表。似乎没有任何理由先做User.find(...)。不妨只查询 timesheets 表,它只会执行一个查询,因此速度更快:

@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 回答