2012-02-27 29 views
12

Sau khi đọc: thisactiverecord - cách lấy tất cả cột của các bảng đã tham gia

Tôi vẫn chưa hiểu. trong bảng điều khiển:

puts Category.joins(:posts) 

Nó thực hiện tham gia hoặc tham gia vào Danh mục và Đăng.

Tuy nhiên, tất cả dữ liệu được trả lại chỉ là các cột trong bảng Danh mục. Cách lấy dữ liệu cột đó trong Bài đăng. ?

Tôi có nên tạo mô hình khác để đạt được điều này không?

sau khi đọc: this Có phải find_by_SQL là cách duy nhất không? Tôi muốn cách ActiveRecord nếu có thể.

Cảm ơn.

+0

Bạn nên cụ thể hơn về những gì bạn cố gắng đạt được. Nếu bạn muốn nó "cách Active Record", bạn thậm chí không nên nói về "cột" bởi vì bạn thao tác các đối tượng, không phải bảng. Nếu bạn thực sự cần dữ liệu thô, bạn có thể sử dụng 'ActiveRecord :: Base.connection.select_all ('SELECT ...')', điều này sẽ trả về cho bạn một mảng băm (không có mô hình instanciation). [tài liệu ở đây] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all) –

+0

cảm ơn, tôi đang sử dụng cách này ngay bây giờ: ActiveRecord :: Base.connection .select_all (Category.joins (: posts) .to_sql)), đây có phải là cách quá khó chịu không? –

+0

Không sao cả. Tuy nhiên, nếu bạn thực sự muốn làm việc theo cách ORM, bạn chỉ nên sử dụng các loại thủ thuật này cho các truy vấn SQL thực sự phức tạp. Đối với một vấn đề tầm thường như vậy, tôi sẽ sử dụng giải pháp @ abhishek + 'includes' để thay thế. Tại sao phải sử dụng ORM nếu bạn không mã hóa theo cách OO? –

Trả lời

4

Bạn có thể nhận các cột trong bảng viết bằng cách thực hiện truy vấn hơn nữa, một cái gì đó giống như -

Category.joins(:posts).collect{|category| category.posts.map{|post| post.attributes.merge(category.attributes) } } 

này sẽ cung cấp cho bạn một danh sách khổng lồ của bài và các thuộc tính danh mục được hợp nhất với nhau cho từng Danh mục.

Nhưng điểm của việc tham gia vào Danh mục là để có được một tập hợp các Danh mục có nhất định tuân theo tiêu chí tham gia nhất định. Nếu chúng ta lấy ví dụ tiếp theo trong hướng dẫn tương tự,

Post.joins(:category, :comments) 

này cũng cung cấp cho bạn một danh sách các chỉ bài, nhưng danh sách chỉ chứa các bài viết mà theo tham gia hạn chế, đó là, tất cả họ đều có một danh mục và một lời bình luận.

+3

hãy cẩn thận, 'collect' có khả năng sẽ dẫn đến vấn đề truy vấn N + 1 . Để tránh điều này, hãy sử dụng 'include'. xem [hướng dẫn của RoR về tải háo hức] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) –

+0

@m_x tất nhiên, mã đó là đúng để trình diễn. – abhishek

+0

thanks @m_x và abhishek –

6

Bạn có thể thử chọn phương pháp():

Category.select("categories.*, posts.*").joins(:posts) 
+1

Cảm ơn bạn đã trả lời. Điều này không thể làm việc. Nó vẫn chỉ trả về "danh mục. *". Mặc dù SQL được tạo ra là "SELECT loại. *, Bài viết. * Từ ... –

+0

Làm cách nào để kiểm tra xem nó có hoạt động không? Tôi vừa thử nghiệm nó, hoạt động tốt cho tôi. – Ineu

+0

Tôi chạy lệnh này trong" giao diện điều khiển đường ray " Sử dụng đặt và ap (bản in tuyệt vời): đặt Category.select ("categories. *, Posts. *"). Join (: posts) Nó chỉ trả về # object. Và chỉ cột của Category –

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