2014-10-23 19 views
11

Trong ứng dụng ray của tôi, bộ sưu tập có nhiều dự án, và các dự án có nhiều bước.nhổ liên quan đến mô hình trong Rails truy vấn

Tôi muốn lấy tất cả các id của các bước trong các dự án của bộ sưu tập và tôi tự hỏi liệu mình có thể làm tất cả trong một truy vấn hay không.

Ví dụ, tôi biết tôi có thể làm như sau

step_ids = [] 
@collection.projects.each do |project| 
    project.steps.each do |step| 
     step_ids << step.id 
    end 
end 

Nhưng là nó có thể làm điều gì đó như sau:

@collection.projects.include(:steps).pluck("step.id") // cú pháp ở đây là không đúng

Trả lời

20

Hãy thử điều này :

Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id') 

Lưu ý việc sử dụng project cho các kết nối, và sau đó projects cho mệnh đề where. Đầu tiên tương ứng với mối quan hệ thuộc_toặc, và sau đó là tên của bảng db.

chỉnh sửa: trong trường hợp của một mối quan hệ nhiều-nhiều giữa các dự án và các bộ sưu tập, và giả sử một dự án belongs_to một project_collection (và sau đó has_many :collections, through :project_collection)

Step.joins(:project => :project_collection) 
    .where(project_collections: { collection_id: @collection.id }) 
    .pluck(:'steps.id') 
+0

cảm ơn sự giúp đỡ của bạn. các dự án thực sự có thể thuộc về nhiều bộ sưu tập, vì vậy không có thuộc tính collection_id cho các dự án. bất kỳ ý tưởng nào về cách thay đổi đề xuất của bạn? – scientiffic

+0

có bảng 'projects_collections' không? Bạn có thể mở rộng tham gia để bao gồm nó .... Tôi sẽ chỉnh sửa câu trả lời của tôi với một ví dụ. – John

+0

cảm ơn bạn vì ví dụ của bạn - nó làm việc cho tôi! – scientiffic

1

Thật không may, tôi không nghĩ rằng chúng ta có thể làm điều đó thông qua AR trong một truy vấn. Bạn có thể thực hiện truy vấn lồng nhau bên dưới để truy vấn nó trong hai truy vấn tới cơ sở dữ liệu:

Step.includes(:projects).where(projects: { id: Projects.includes(:collections).where(collections: { id: @collections.id }).pluck(:id) }).pluck(:id) 
Các vấn đề liên quan