1

下面的 find 方法返回所有记录,但不包括场所表列。有没有办法可以修改以下内容以包含来自场地的列?我试过了:select => 'venues.id',而且:select => 'venues.*',无济于事。也许这是 rails find 方法的限制。可以将查询重写为“Item.where”以包含所有列吗?

@vehicles = Vehicle.find(:all, 
      :select => '*',
      :joins => [:vehicle_status, :category, :user],
      :include => [:venue],
      :conditions => ["vehicles.client_id = ? ", current_user.client_id]
      )

我正在使用导轨 3.2.11。

另外,当我:select => 'vehicles.*, venues.*'在控制台上使用并获取以下查询时,它会显示正在选择的场所字段,但它们不会出现在返回的 json 中:

    SELECT "vehicles"."id" AS t0_r0, ... "vehicles"."created_at" AS t0_r33, 
"vehicles"."updated_at" AS t0_r34, "venues"."id" AS t1_r0, "venues"."client_id" AS t1_r1, 
"venues"."venue_name" AS t1_r2, "venues"."created_at" AS t1_r3, "venues"."updated_at" AS t1_r4 
FROM "vehicles" INNER JOIN "vehicle_statuses" ON "vehicle_statuses"."vehicle_status_code" = 
"vehicles"."status_code" INNER JOIN "categories" ON "categories"."id" = 
"vehicles"."category_id" INNER JOIN "users" ON "users"."id" = "vehicles"."created_at_user_id" 
LEFT OUTER JOIN "venues" ON "venues"."id" = "vehicles"."venue_id" WHERE (vehicles.client_id = 
500 )

但是,如果我使用:select => '*',控制台会显示两个查询:一个用于车辆表,另一个用于场地:Venue Load (0.3ms) SELECT "venues".* FROM "venues" WHERE "venues"."id" IN (5000 )

4

2 回答 2

2

你应该试试

format.json { render json: @vehicles, :include => :venue }

你也可以加入

@vehicles = Vehicle.where(client_id: current_user.client_id).joins(:category, :vehicle_status).includes(:venue) 

一个或多个场地取决于has_manyhas_one。有关更多信息,请在此处查找内容http://guides.rubyonrails.org/active_record_querying.html

于 2013-04-19T01:14:16.117 回答
0

使用来自 shihirmk 的输入,尤其是在 JSON 响应中,答案如下:

   #where version
   @vehicles = Vehicle.where("vehicles.client_id = ?", current_user.client_id )
   .joins(:category, :vehicle_status, :user)
   .includes(:venue)
   .select("vehicles.id, vehicles.description, categories.category_description, venues.venue_name, users.email")

------ 
   #find version
   @vehicles = Vehicle.find(:all, 
      :select => 'vehicles.id, vehicles.description, categories.category_description, venues.venue_name, users.email',
      :joins => [:vehicle_status, :category, :user],
      :include => [:venue],
      :conditions => ["vehicles.client_id = ?", current_user.client_id])

-----
   format.json { render json: @vehicles, :include => [:venue, :category, :vehicle_status, :user ] }

主要经验教训:

1)如果您在选择中包含特定列,则子/父表不会被 JSON 根包装,您可以简单地将字段称为“venue_name”而不是“venues.venues_name”。所以我强烈建议在使用 WHERE 或 FIND 连接多个表时使用 SELECT 并指定列。您希望这样做,因为多个表可能会有一个“id”列。

2)您必须明确您的 JSON 返回的内容(感谢@shishirmk)。请参阅我的示例以返回多个表/模型。

3) Rails 需要对这些类型的查询提供更好的文档,特别是因为框架不赞成使用数据库视图:-)

于 2013-04-20T19:17:38.043 回答