2012-06-27 34 views
25

Tôi có đoạn mã sau:Rails "find_all_by" vs ".where"

def maturities 
    InfoItem.find_all_by_work_order(self.work_order).map(&:maturity) 
end 

Tôi đã suy nghĩ về việc thay đổi nó để:

def maturities 
    InfoItem.where(work_order: self.work_order).map(&:maturity) 
end 

Nên có bất kỳ lợi thế này? Có vẻ như .where phổ biến hơn find_all_by ngày nay.

+0

Tôi đang trong quá trình nâng cấp một ứng dụng từ Rails 4.0.3 đến 4.1.0 và mã của tôi là sử dụng ' find_all_by' không còn hoạt động nữa ('NoMethodError'). Tôi không thấy bất cứ điều gì trong các ghi chú phát hành có thể ảnh hưởng đến nó. Tôi sẽ phải chuyển sang 'where'. Tôi đã sử dụng 'where' ngay từ đầu, mã của tôi sẽ ít bị lỗi như vậy. Có [một bình luận dưới đây] (http://stackoverflow.com/questions/11232971/rails-find-all-by-vs-where#comment14759921_11233522) đề cập rằng 'find_all_by_ *' sẽ không được chấp nhận trong Rails 4. Tuy nhiên, điều này đến làm tôi ngạc nhiên. Phương pháp này được loại bỏ ở đâu? – Dennis

+0

Tôi tìm thấy nơi tài liệu của nó được ghi lại. Trong ghi chú phát hành 4.1: "Đã loại bỏ activerecord-deprecated_finders dưới dạng phụ thuộc. Vui lòng xem gem README để biết thêm thông tin." – Dennis

+0

Tôi cũng khuyên bạn nên sử dụng 'pluck' thay vì' map' trong loại tình huống này. 'InfoItem.where (work_order: self.work_order) .pluck (: maturity)' – jurassic

Trả lời

25

Ý kiến ​​của tôi là sử dụng .where là cách tiếp cận tốt hơn.

Khi bạn sử dụng công cụ tìm thuộc tính, bạn sẽ phải thông qua phương thức thiếu cuộc gọi và cuối cùng xác định phương thức lớp, qua class_eval, trả về kết quả của bạn. Đây là xử lý bổ sung mà bạn có thể không cần phải làm.

Ngoài ra, xâu chuỗi lại với nhau: find_by_this_and_this_and_this_and_this ... có thể trở nên xấu xí.

See how rails accomplishes attribute based finders here

Phương mất tích từ DynamicMatchers mô-đun trên github:

def method_missing(name, *arguments, &block) 
    match = Method.match(self, name) 

    if match && match.valid? 
    match.define 
    send(name, *arguments, &block) 
    else 
    super 
    end 
end 
+2

giải thích tuyệt vời – holaSenor

+0

Cảm ơn bạn đã dành thời gian và suy nghĩ về điều này, tôi đánh giá cao câu trả lời của bạn. Tôi sẽ cho phép một số thời gian cho các đề xuất khác trước khi tôi đánh dấu một là "câu trả lời của tôi". Cảm ơn ngài. – ardavis

+1

Bạn được chào đón. Đây chỉ là ý kiến ​​của tôi và có thể rất tốt không phải là lời giải thích tốt nhất. Câu hỏi tuyệt vời! – Kyle

2

Tôi nghĩ lợi thế chính là có thể thêm tiêu chí bổ sung vào vị trí, find_all_by được giới hạn trong trường của công cụ chọn động. Nếu bạn chỉ có một điều kiện mà bạn đang tìm kiếm thì tôi nghĩ đó là một lần rửa, nhưng khi bạn bắt đầu thêm 3 hoặc 4, những người tìm kiếm động có thể xấu xí. Hashes là tốt đẹp để xem xét, và bạn có thể vượt qua một hash của điều kiện như một tham số nếu cần thiết. Công cụ tìm kiếm động rất thú vị, nhưng tôi nghĩ quy mô một cách rõ ràng hơn và dễ đọc hơn.

+0

Nhưng tôi có thể thực hiện thành công một cái gì đó như: 'InfoItem.find_all_by_work_order_and_description (self.work_order," bla bla bla ")' – ardavis

+0

Tôi không có nghĩa là bạn không thể thêm nhiều hơn vào công cụ tìm kiếm động, nhưng chuyển một giá trị băm làm tham số đến vị trí sạch hơn. IMO – holaSenor

+2

AFAIK. Ở đâu là 'Rails 3 cách' để làm điều đó, chưa kể nó sạch hơn và linh hoạt hơn nhiều. –

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