2016-01-04 3 views
1

В моем приложении Rails, у меня есть 3 модели Order и такси и пассажира. Вот схема заказа таблицы, где taxi_id является внешний ключ такси, и passenger_id является Foregin ключ пассажираActiveRecord поле выбора из двух соединенных таблиц

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

    end 

здесь схема такси:

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 =>: пассажир) .where (: taxis => {: id => 29}).все ** – Salman

+0

Это значительно отличается от кода в вашем вопросе. Измените свой вопрос, чтобы включить фактический код, который вы используете. Непонятно, почему вы используете 'joins (: orders =>: пассажир)', если вы не используете никаких полей от 'пассажиров'. Может быть, вы хотите ['includes'] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) вместо этого? –

+0

Я отредактировал мой вопрос, мог бы у плз взглянуть на это – Salman

Смежные вопросы