2016-01-04 150 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