2015-09-26 21 views
5

Phương thức Rails find có được chấp nhận không?Rails có bị phản đối không?

Trong những ngày cũ, find(1) là cách ưa thích để tìm theo id.

Sử dụng find_by(id:1) thay vì find(1) có tốt hơn không?

+8

'find' là phương pháp đầu tiên được đề cập trong ActiveRecord [Hướng dẫn Rails] (http://guides.rubyonrails.org/active_record_querying.html#retrieving-a-single-object), vì vậy tôi nghĩ rằng nó an toàn để nói nó vẫn là con đường để đi. –

+3

Bạn có thấy bị phản đối trong RubyMine không? Nếu có, nó là biết và báo cáo lỗi: https://youtrack.jetbrains.com/issue/RUBY-17979 –

Trả lời

4

Không có phương pháp bị phản đối (như xa như tôi biết). Sự khác biệt giữa findfind_by() là những gì họ quay trở lại khi bản ghi không tồn tại. Nếu một kỷ lục với một ID của 23 không tồn tại, đây là những gì bạn nhận được:

Model.find(23) 
=> ActiveRecord::RecordNotFound: Couldn't find Model with 'id'=23 

Hoặc

Model.find_by(id: 23) 
=> nil 

Sử dụng find_by là tha thứ hơn nếu bạn đang làm cho các truy vấn mà một kỷ lục không tồn tại có thể vì bạn nhận được giá trị nil thay vì ngoại lệ.

0

Do Rails 4.2.1, nó không phải là. Here là tài liệu API cho nó (không chính thức, nhưng khá tốt). Những gì tôi nghĩ bạn đang xem là this method, không được chấp nhận trong Rails 3.0.0.

Tôi chưa bao giờ sử dụng phương pháp find_by(). Tôi tin rằng tốt hơn/phương pháp mới để sử dụng là phương pháp where(), như vậy:

User.where(name: "Bob", email: "[email protected]") 
+1

'where' không phải là tốt hơn/mới hơn, nó chỉ làm một cái gì đó khác nhau. Và điều đó không được chấp nhận tìm thấy bạn liên kết đến cơ bản vẫn là phương pháp tương tự. Nó chỉ được chuyển từ 'Base' sang' FinderMethods'. – Mischa

+3

'find_by (x)' có thể được coi là tương đương với 'where (x) .first'. –

+0

.where() trả về một mảng các đối tượng trong khi .find_by() trả về một thể hiện của một đối tượng. –

1

Có lẽ bạn đang đề cập đến việc không dùng của ActiveRecord::Base#find như find (: thứ nhất)find (: tất cả) được phản đối ủng hộ phương pháp đầu tiên và tất cả.

Hỗ trợ cho phương pháp này đã bị xóa khỏi đường ray 3.2.

Phương pháp bạn đã sử dụng (ActiveRecord::FinderMethods#find) không được dùng nữa.

+1

FWIW, tôi nghĩ sự nhầm lẫn là với phương thức 'find_by_xxx'. Tôi nghĩ những thứ đó không được chấp nhận trong Rails 4. –

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