2011-11-06 22 views
5

Tôi có một hoạt động trong đó hoạt động trên mô hình trả về một đối tượng. Nhưng tôi không thể sử dụng nó trong ký hiệu đối tượng (nó xuất hiện để trả về một mảng với đối tượng tại [0]).Tại sao một bản ghi tra cứu đơn lẻ trả lại một mảng? (Rails người mới bắt đầu)

store = Store.where("some_id = ?", some_id) 

puts store.name # doesn't work 

puts store # shows array with the object at [0] 

Trả lời

10

Vì đôi khi bạn không biết có bao nhiêu đối tượng truy vấn nên trả lại, vì vậy để nhất quán bạn luôn nhận được mảng.

Để có được một đối tượng duy nhất sử dụng

store = Store.where("some_id = ?", some_id).first 

Nếu bạn đang tìm kiếm ID chính của mô hình, bạn cũng có thể sử dụng

store = Store.find(some_id) 

mà sẽ nâng cao một ngoại lệ RecrodNotFound (xử lý bởi đường ray mặc định là 404) nếu không tìm thấy đối tượng.

+0

thế nào có thể Tôi kiểm tra xem không có kết quả nào được trả lại không? điều này dường như không hoạt động: 'đặt store.name trừ khi store.blank' – Hopstream

+1

Nó sẽ trả về' nil' nếu không tìm thấy gì cả, bạn có thể kiểm tra với 'store.nil?'. –

+0

Một câu hỏi ngớ ngẩn cuối cùng Jakub ... Có một ký hiệu tốt hơn để viết '.where (" some_id =? ", Some_id)' ... làm một cái gì đó giống như công việc này trong đường ray ... '.where (: some_id = > some_id) ' – Hopstream

0

Trường hợp mệnh đề trong đường ray 3.x sẽ luôn trả về và arel objec, mà bạn có thể sử dụng cho chuỗi phương pháp.

Vì vậy, câu lệnh trả về mệnh đề where luôn là một mảng.

Đối với việc tiếp cận các yếu tố đầu tiên bạn phải làm

object.first theo đề nghị của Jakub

5

Ngoài ra còn có Finders động

Store.find_by_some_id(some_id) 

Họ là tương đương với

Store.where(:some_id => some_id).first 
+0

Đáng chú ý, công cụ tìm kiếm động (không phải find_by *) không được hỗ trợ trong Rails 4 Nguồn: http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record-deprecations – GantMan

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