2012-01-27 19 views
24

Tôi đang cố thực hiện truy vấn trong Rails bằng ActiveRecord chỉ định một số điều kiện trên bảng đã nối. Và tôi dường như không thể có được nó để làm việc, mặc dù tôi làm theo các ví dụ từ đây:Cách xác định các điều kiện trên bảng đã nối trong đường ray

http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

Từ hướng dẫn trên guides.rubyonrails.org:

Client.joins(:orders).where(:orders => {:created_at => time_range})

schema cơ sở dữ liệu của tôi trông như thế này, với một số điểm, bảng trình và bảng nhiệm vụ:

create_table "scores", :force => true do |t| 
    t.integer "value" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "scores", ["user_id"], :name => "index_scores_on_user_id" 

    create_table "submissions", :force => true do |t| 
    t.integer "user_id" 
    t.integer "task_id" 
    t.integer "score_id" 
    t.datetime "completed_at" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "submissions", ["score_id"], :name => "index_submissions_on_score_id" 
    add_index "submissions", ["task_id"], :name => "index_submissions_on_task_id" 
    add_index "submissions", ["user_id"], :name => "index_submissions_on_user_id" 

    create_table "tasks", :force => true do |t| 
    t.integer "episode_id" 
    t.integer "score" 
    t.string "key" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

Vì vậy, tôi muốn thực hiện truy vấn nơi tôi có thể tìm thấy tất cả "điểm" có liên quan đến một nhiệm vụ không đáng kể. Gửi thuộc về nhiệm vụ và điểm số.

truy vấn của tôi bây giờ trông như thế này:

Score.joins(:submission).where(:submission => {:task_id => 1}) 

này tạo ra cú pháp sau:

SELECT "scores".* FROM "scores" INNER JOIN "submissions" ON "submissions"."score_id" = "scores"."id" WHERE "submission"."task_id" = 1 

nào tạo ra được lỗi sau:

SQLite3::SQLException: no such column: submission.task_id 

Nhưng có một cột submission.task_id , bạn có thể thấy trong lược đồ db. Và tôi có thể làm điều này thành công:

SELECT "submissions".* FROM "submissions" WHERE "submissions"."task_id" = 1 

Trả lời

44

Tên trong mệnh đề nên số nhiều để tham khảo các tên bảng:

Score.joins(:submission).where(:submissions => {:task_id => 1}) 
+2

Thực tế, theo đoạn mã hướng dẫn Rails được đăng, vì vậy biểu tượng 'tham gia'. – Chowlett

+1

Hoàn toàn chính xác của bạn! Chỉ cần tìm ra điều đó. Darn. – espenhogbakk

+0

@Chowlett, đó là vì họ có mối quan hệ Nhiều đến Nhiều, tôi chỉ có One to One, has_one, instad of has_many. Đó cũng là lý do tại sao tôi không nắm bắt số nhiều trong tham chiếu đến tên bảng tôi nghĩ. – espenhogbakk

0

truy vấn của bạn trông như thế này

Score.joins(:submission).where(:submission => {:task_id => 1}) 

#joins của bạn là chính xác, nhưng # địa điểm của bạn: trình phải là số nhiều.

3

Thông báo trước: nếu bạn đang sử dụng tên bảng không chuẩn, điều này sẽ không thành công.

ActiveRecord :: StatementInvalid: PG :: UndefinedTable: ERROR: thiếu FROM-khoản mục nhập cho bảng "đệ trình"

Để sửa lỗi này, hãy đặt (joined-model-class).table_name như một chìa khóa trong nơi băm:

Score.joins(:submission).where( Submission.table_name => {task_id: 1} )

4

Tên khoản phải là số nhiều để tham chiếu đến tên bảng.

Score.joins(:submission).where(submissions: { task_id: 1 }) 

Nếu điểm số có nhiều lần gửi, biểu tượng tham gia cũng nên số nhiều để tham chiếu quan hệ giữa Điểm và Nội dung gửi.

Score.joins(:submissions).where(submissions: { task_id: 1 }) 
0

Tôi thấy điều này dễ dàng hơn.

Score.joins(:submission).merge(Submission.where(task_id: 1)) 
Các vấn đề liên quan