2016-01-04 361 views
1

在我的Rails應用程序,我有3種型號訂購出租車乘客。這裏是訂單表,其中taxi_id的架構出租車的外鍵,和passenger_id是乘客ActiveRecord的兩個選擇字段連接表

create_table "orders", force: :cascade do |t| 
    t.integer "passenger_id" 
    t.integer "taxi_id" 
    t.integer "price" 
    . 
    . 
    . 

    end 

這裏的foregin關鍵是出租車的模式:

create_table "taxis", force: :cascade do |t| 
    t.string "taxiNo" 
    t.string "address" 
    . 
    . 

    end 

這裏是我的乘客架構

create_table "passengers", force: :cascade do |t| 
    t.string "name" 
    t.string "address" 
    t.string "destination" 
    end 

乘客的地址清除乘客的來源,地址出租車定義了這輛出租車的當前地址。

我試圖運行此查詢:

Taxi.joins(:orders => :passenger).select('taxis.id, orders.price, passengers.address, passengers.destination').where(:taxis =>{:id =>29 }).all 

作爲一個事實的問題,我要找價格,地址和唯一的乘客場的目標,但結果是[#<Taxi id: 29, address: "Narva mnt25, Tartu, Estonia">]

在這裏你可以找到結果:

SELECT taxis.id, orders.price, passengers.address, passengers.destination FROM "taxis" INNER JOIN "orders" ON "orders"."taxi_id" = "taxis"."id" INNER JOIN "passengers" ON "passengers"."id" = "orders"."passenger_id" WHERE "taxis"."id" = 29 
=> #<ActiveRecord::Relation [#<Taxi id: 29, address: "Narva mnt25, Tartu, Estonia">]> 

它給了我Taxi_address同時,我問Order.price,Passenger.address和Passenger.destination

重要的一點:

我確信Taxi_id = 29存在

Taxi.find_by_id(29) 
    Taxi Load (0.2ms) SELECT "taxis".* FROM "taxis" WHERE "taxis"."id" = ? LIMIT 1 [["id", 29]] 
=> #<Taxi id: 29, taxiNo: "T6", address: "Narva mnt25, Tartu, Estonia", status: "1", avalible_duration: 6, created_at: "2016-01-02 14:44:06", updated_at: "2016-01-02 14:44:06"> 

我相信,我有記錄在我的訂單表

Order.find_by_id(1) 

    Order Load (0.4ms) SELECT "orders".* FROM "orders" WHERE "orders"."id" = ? LIMIT 1 [["id", 1]] 
=> #<Order id: 1, passenger_id: 40, taxi_id: 29, price: 925, created_at: "2016-01-04 04:40:52", updated_at: "2016-01-04 04:40:52"> 

回答

0

的原因,您的查詢返回這樣的:

[#<Taxi id: nil>] 

...是你沒有選擇id場在你的查詢中。你仍然獲得一個記錄,它只是沒有id。這將解決這個問題:

Taxi.joins(:orders).select('taxis.id, orders.price').where(:taxis =>{:id =>29 }) 

不過,既然你想從orders表中的字段,你應該查詢訂單模式,而不是出租車型號:

Order.select(:id, :price).where(taxi_id: 29) 

...但如果你只關心的值,並非訂單或出租車對象本身,使用pluck代替:

Order.where(taxi_id: 29).pluck(:price) 
# => 925 
+0

我查詢** **的出租車,因爲在** **令我有另一個外鍵。但在這裏問一個簡單的問題,我只是刪除它。確切的查詢是這樣的: ** Taxi.joins(:orders =>:passenger).where(:taxis => {:id => 29})。全部** – Salman

+0

這與您問題中的代碼顯着不同。請編輯您的問題以包含您使用的實際代碼。如果你沒有使用來自'乘客'的任何字段,那麼你爲什麼要使用'join(:orders =>:passenger)'還不清楚。也許你想要['includes'](http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations)? –

+0

我編輯了我的問題,你可以看看那個 – Salman