Rails find方法 - 从“:include”表参数中选择列

时间:2013-04-19 00:23:01

标签: ruby-on-rails-3 activerecord

以下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]
      )

我正在使用rails 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 => '*',控制台会显示两个查询:一个用于车辆表,另一个用于场地:场地负载(0.3ms)选择“场地”。*来自“场地”WHERE“场地“。”id“IN(5000)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

根据shishirmk的输入,尤其是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)如果在select中包含特定列,则子/父表将不是JSON根包装,并且您可以简单地将字段称为“venue_name”而不是“venues.venues_name”。所以我强烈建议在使用WHERE或FIND连接多个表时使用SELECT并指定列。您希望这样做,因为多个表可能具有“id”列。

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

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