2013-03-03 25 views

Trả lời

49

Sự khác biệt là những gì họ quay lại khi tìm thấy bản ghi hoặc khi không tìm thấy bản ghi. Hãy xem xét các ví dụ sau:

>> User.create name: 'THE USER' # creates a user with id = 1 
>> User.find(1) # returns the user 
>> User.find_by_id(1) # returns the user 
>> User.where(id: 1).first # returns the user 

Như bạn có thể thấy, người dùng hiện tại có thể được tìm nạp bằng bất kỳ phương pháp nào trong số 3 phương pháp. Sự khác biệt lớn với việc sử dụng where là bạn có thể lệnh chuỗi (tất nhiên, mà không gọi first đầu tiên.)

Hãy có một cái nhìn tại khi bạn cố gắng tìm ra một kỷ lục mà không phải là hiện

>> User.find(2) # raises an exception 
>> User.find_by_id(2) # nil 
>> User.where(id: 2).first # nil 

Vì vậy, ở đây, rõ ràng là khi bạn sử dụng find để tìm kiếm bản ghi không tồn tại, bạn sẽ nhận được một ngoại lệ. Ngoại lệ đó là ActiveRecord::RecordNotFound, hiển thị 404 trên môi trường sản xuất.

Hy vọng điều này sẽ hữu ích!

CẬP NHẬT

Rails 4 sử dụng cú pháp sau đây để find_by

>> User.find_by(id: 1) # returns nil if there's no user with an id of 1 
>> User.find_by!(id: 1) # raises ActiveRecord::RecordNotFound when no record is found 
+18

Bạn nên lưu ý rằng tất cả các phương thức 'find_by_ *' đều bị mất giá trị trong đường ray 4 có lợi cho 'find_by (*: ...)' ở đây sẽ là: 'find_by (id: ...) ' – pjam

+3

wow Tôi không biết điều đó. cảm ơn! tại sao không phải là đề cập ở đây? http://edgeguides.rubyonrails.org/4_0_release_notes.html – jvnill

1

find => này được sử dụng để tìm hàng bởi id. Điều này sẽ trả về một bản ghi.

YourModel.find(2) 
Address.find(1) 

find_by => điều này được sử dụng để nhận hàng theo bất kỳ thuộc tính nào của bản ghi. Điều này sẽ trả lại bản ghi khớp đầu tiên nếu điều kiện phù hợp.

YourModel.find_by_attrname("value") 
Address.find_by_street_name_and_city("Andheri", "Newyork") 
Addess.find_by_id(4) 

where => này được sử dụng để ghi chép hoạt động dựa trên các điều kiện để trở lại mối quan hệ kỷ lục hoạt động (ví dụ) có thể không hay nhiều hồ sơ.

YourModel.where(:attrname => "something") 
Address.where(:city => "Newyork") 
2

tìm => trả lại hồ sơ duy nhất này nếu primary_key nhất định (id) tồn tại trong hệ thống khác trong sẽ cung cấp cho một lỗi.

Model.find(required_id_value) 

find_by => Đây sẽ trở lại hồ sơ duy nhất phụ thuộc vào thuộc tính nhất định, và nếu giá trị của thuộc tính là không tồn tại trong DB nó sẽ trở lại con số không.

Model.find_by_name("your name") 

tên ở đây là thuộc tính và nó phải tồn tại trong Phương thức của bạn.

trong đó => Điều này sẽ trả lại một mối quan hệ bản ghi đang hoạt động với số không hoặc nhiều bản ghi bạn cần sử dụng trước để chỉ trả về một bản ghi hoặc không trong trường hợp không có bản ghi.

Model.where(id: id_value).first 
+0

** Record.find (0) ** tăng 'ActiveRecord :: RecordNotFound: Không thể tìm thấy Bản ghi với 'id' = 0' ** Record.find_by (id: 0) ** trả về 'nil' Record.find_by_id (0) cũng trả về nil mặc dù nó không được chấp nhận trong các phiên bản sau của đường ray. ** Record.where (id: 0) ** trả về một mảng trống – Hanmaslah

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