以下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)
答案 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_many
或has_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需要有关这些类型查询的更好文档,特别是因为框架对使用数据库视图不满意: - )