2009-12-17 29 views
6

Tôi có một số truy vấn find_by_sql tùy chỉnh trong Rails. Tôi muốn sử dụng tải háo hức với họ nhưng có vẻ không phải là một cách tốt để làm điều này.Đường ray thêm tải mong muốn tùy chỉnh

Tôi đã thấy tệp eager_custom.rb nổi xung quanh và dường như nó không hoạt động với Rails ngay bây giờ. Nó xuất hiện Rails hiện mong muốn tải khác nhau ngay bây giờ, bằng cách sử dụng 2 truy vấn (truy vấn thông thường cộng với truy vấn trong đó 'id IN' các id từ truy vấn đầu tiên), thay vì truy vấn nối đơn được sử dụng trong quá khứ.

Câu hỏi của tôi là nếu tôi thực hiện truy vấn SQL tùy chỉnh, sau đó truy vấn 'id IN', có cách nào để thêm lại các đối tượng liên kết vào kết quả truy vấn ban đầu không?

Ví dụ tôi có chủ đề được tải với find_by_sql, sau đó tôi tìm thấy hình ảnh chủ đề mà id chủ đề nằm trong id chủ đề, có cách nào để thêm hình ảnh theo cách thủ công về chủ đề không?

Cảm ơn

Trả lời

10

Như bạn thấy, trong Rails 2.1 một loại mới của pre-tải/háo hức được giới thiệu trong đó sử dụng nhiều truy vấn với id IN (...). Phương pháp này thường nhanh hơn, đặc biệt khi có nhiều liên kết được tải sẵn. Bạn có thể sử dụng chức năng này theo cách thủ công với find_by_sql bằng cách sử dụng phương pháp lớp học preload_associations được kế thừa từ ActiveRecord (không được khuyến nghị). Ví dụ:

class Person 
    def self.find_a_special_group 
    people = find_by_sql("...") 
    preload_associations(people, [:jobs, :addresses]) 
    return people 
    end 
end 

Phương pháp preload_associations được bảo vệ, vì vậy bạn phải gọi nó từ bên trong lớp, và phải mất (1) một mảng của các đối tượng, (2) một mảng, băm, hoặc biểu tượng của hiệp hội (định dạng tương tự như tùy chọn :include) và (3) một băm tùy chọn. Xem tài liệu cho mô-đun ActiveRecord :: AssociationPreload :: ClassMethods để biết thêm chi tiết.

Tuy nhiên, đã nói tất cả điều đó, kỹ thuật này chắc chắn là không mong muốn vì tài liệu Rails không khuyến khích người lập trình sử dụng trực tiếp preload_associations. Bạn có chắc chắn bạn phải sử dụng find_by_sql? Bạn có chắc chắn rằng bạn biết tất cả các tùy chọn find có? (:select, :from, :joins, :group, :having, v.v.) Tôi không nói rằng bạn không cần find_by_sql, nhưng có thể đáng giá vài phút để đảm bảo.

+0

Điều này là hoàn hảo, cảm ơn rất nhiều. Tôi không muốn sử dụng find_by_sql nhưng tôi có một số truy vấn rất phức tạp. – riley

+0

Cảm ơn, Alex! – MikeMarsian

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