2011-06-13 34 views
28

Nơi tôi sử dụng để làm điều này:Cách tốt nhất để tìm một bản ghi duy nhất bằng ActiveRecord 3/Arel?

Foo.find_by_bar('a-value') 

tôi bây giờ có thể làm điều này:

Foo.where(:bar => 'a-value').limit(1).first 

Đây có phải là đề nghị? Đây có phải là cách tốt nhất? Tôi có nên tiếp tục sử dụng cách "cũ" vì nó tiếp tục là cú pháp cú pháp hữu ích hay không, thậm chí có cách nào tốt hơn tôi có thể làm điều đó ngay bây giờ, điều này sẽ hỗ trợ chuỗi và tất cả những thứ tốt khác không?

+2

Tôi thực sự khá giống như find_by_ * cũ. Mục đích là rõ ràng, và nếu đó là tất cả những gì bạn cần, cú pháp đơn giản hơn. –

+1

Và nó vẫn hoàn toàn hợp lệ trong Rails 3. Nếu sử dụng Rails 4, bạn có thể sử dụng 'find_by (bar: 'a-value')'. – sevenseacat

Trả lời

38

Rails 4:

Foo.find_by bar: 'a_value' , wibble: 'a wibble value' 
+0

Bạn có thể thêm nguồn cho mục này không? – l8nite

+0

http://guides.rubyonrails.org/active_record_querying.html –

+0

Bất kỳ ý tưởng nào tại sao RubyMine cảnh báo rằng phương pháp này không nên được gọi từ trình trợ giúp xem? – TyrionLannister

22

Tôi nghĩ rằng cách thích hợp hơn để trả lại một hồ sơ duy nhất sẽ là dọc theo dòng của ví dụ thứ hai của bạn, nhưng bạn có thể bỏ qua phần giới hạn:

Foo.where(:bar => 'a-value').first 

này theo cú pháp mới và hỗ trợ chaining nếu bạn muốn để thêm nhiều điều kiện hơn vào tra cứu.

+1

Sử dụng 'Foo.where (: bar => 'a-value'). Đầu tiên!' Nếu bạn muốn đảm bảo bản ghi được tìm thấy. Bằng cách đó, 'ActiveRecord :: RecordNotFound' sẽ được nâng lên theo cách khác. – iltempo

3

Rails mang đến cho bạn một tải toàn bộ các phương pháp kỳ diệu cho các loại hình điều:

Foo.find_by_bar('a-value') 

Bạn cũng có thể sử dụng nhiều thuộc tính:

Foo.find_by_bar_and_wibble('a foo value', 'a wibble value') 

Và phụ thêm một! gây ra nó để ném một RecordNotFound nếu không có gì được tìm thấy:

Foo.find_by_bar!('a-value') 
+8

Những công cụ tìm kiếm động này không còn được sử dụng như đường ray 4.0 (http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations) vì vậy có lẽ đây không phải là thói quen tốt để tìm hiểu ngay bây giờ. –

2

thay thế khác:

Foo.find(:first, conditions: { bar: 'a-value' }) 

Bạn cũng có thể sử dụng nhiều thuộc tính:

Foo.find(:first, conditions: { bar: 'a-value' , wibble: 'a wibble value' }) 
Các vấn đề liên quan