2010-07-04 30 views
5

Tôi sử dụng ví dụ với Rails 3, nhưng tôi tin rằng điều này cũng đúng với Rails 2.3.Rails, tại sao tham gia trả về mảng với các giá trị không phải là uniq?

Giả sử, tôi có mô hình Thành phố có nhiều Địa điểm. Tôi cố gắng tìm Thành phố có địa điểm.

tôi sử dụng đoạn mã sau:

City.joins(:locations) 

Nhưng mảng đầu ra là:

=> [#<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">] 

Độ dài mảng là 4 (số địa điểm của Moscow).

Trường hợp nào có thể hữu ích? Cho mục đích gì là 4 bản sao của một đối tượng trong mảng đầu ra?

Tôi có thể sử dụng City.joins (: vị trí) .uniq, nhưng tôi bị mất nhanh nhẹn arel.

Tôi có hai câu hỏi:

  1. Tại sao gia nhập lợi nhuận mảng phi duy nhất?
  2. Ưu tiên sử dụng thay vì tham gia cho mục đích này là gì?

Trả lời

16

Tham gia về cơ bản nói để kết hợp hai bảng và xử lý nó như một bảng, gửi lại mọi thứ sẽ được tìm thấy. Điều đó có nghĩa là nó sẽ tìm thấy bạn mọi sự kết hợp của thành phố và vị trí (Rails đang giúp đỡ bằng cách kết hợp mọi thứ dựa trên mối quan hệ thuộc về/has_many trong các mô hình của bạn).

Làm City.joins(:locations) sẽ là để tìm tất cả các vị trí trong thành phố. Làm việc đó theo cách khác (Location.joins(:city)) sẽ là cho việc tìm kiếm những gì thành phố một địa điểm là ở.

Bây giờ, chỉ cần tìm thấy danh sách các thành phố có một số địa điểm, bạn có thể thử City.select(:city).joins(:locations).group('cities.id') Mệnh select() nói nó chỉ mang lại Thành phố, và mệnh đề group() bảo nó không mang lại các bản sao trùng lặp.

+1

Cảm ơn bạn! nhóm là những gì tôi cần! Nhưng tại sao đường ray không muốn tự nhóm? Đối tượng đường ray đầu ra là mảng của các thành phố không có bất kỳ vị trí nào. Và IMHO không có trường hợp sử dụng cho đầu ra như vậy. – petRUShka

+1

Cảm ơn câu trả lời hữu ích. Một câu hỏi - City.x sẽ không tự nhiên mang lại thành phố mà không cần câu lệnh chọn? –

+0

@edebill có cách nào để bỏ qua nhóm này ('cities.id') 'trên mỗi truy vấn không? – asiniy

Các vấn đề liên quan