2013-08-13 27 views
13

Trong ứng dụng của tôi, tôi đã tạo một tính năng bài đăng gần đây.Rails 4 Relation # all deprecation

@recentposts = Post.all(:order => 'created_at DESC', :limit => 5) 

Biến này gây ra một số rắc rối. Khi tôi chạy thử nghiệm Tôi có lỗi sau:

DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. Post.where(published: true).load). If you want to get an array of records from a relation, you can call #to_a (e.g. Post.where(published: true).to_a). (called from show at /home/mateusz/rails4/Bloggers/app/controllers/users_controller.rb:18)

Tôi đã seraching giải pháp trên Google nhưng tôi không thấy nó ...

Trả lời

18

Chỉ cần viết:

@recentposts = Post.order('created_at DESC').limit(5) 

Các to_a là không rõ ràng cần thiết, như các dữ liệu là lười biếng nạp khi cần thiết.

+0

yêu cầu dòng tương đương. Nếu anh ta đang di chuyển mã, anh ta có thể muốn giữ mọi thứ càng gần với những gì nó đúng hơn? – bluehallu

+0

Tôi cố gắng nghĩ trước một bước. Có, nếu giống hệt như những gì OP muốn. Trước khi không có thay thế, cá nhân tôi tin rằng tốt hơn là chỉ tải dữ liệu khi cần thiết. Ví dụ. bằng cách này bạn vẫn có thể tinh chỉnh sau và thêm phạm vi khi cần. Điều này có thể làm cho mã rất sạch sẽ. – nathanvda

+0

Vâng, tôi đã nói rằng tôi là tất cả vì lười tải nhưng một lần nữa, nếu anh ta chỉ cố gắng di chuyển một ứng dụng, giữ mọi thứ gần như nó có lẽ là ý tưởng tốt nhất trừ khi anh ta biết đủ về ứng dụng để thay đổi nó. – bluehallu

10

Một cuộc gọi đến Post.all sẽ trả về một ActiveRecord::Relation, mà sẽ được nạp lười biếng theo mặc định. Gọi số Post.all.load sẽ trả về số ActiveRecord::Relation háo hức được tải xuống. Cuối cùng, gọi Post.all.to_a sẽ trả về tất cả các bản ghi trong một mảng.

Trong trường hợp của bạn, bạn sẽ làm gì:

Post.order('created_at DESC').limit(5).to_a 

mà sẽ trả về một mảng của 5 bài viết đầu tiên, được sắp xếp theo created_at thứ tự giảm dần.

+0

Không chắc chắn những gì bạn đang đề xuất trong dòng thứ hai, nhưng điều đó không hoạt động chút nào. – nathanvda

+0

Xin lỗi, cảm ơn mliebelt đã sửa lỗi cú pháp. – bluehallu

+4

Nếu tôi sử dụng to_a trực tiếp trên lớp, tôi nhận được lỗi: 'phương thức undefined' to_a 'cho # 'trong Rails 4. – Douglas

2

cách lồng

Post.order('created_at DESC').limit(5).to_a 
+0

Cảm ơn tất cả mọi người đã giúp đỡ :) –

+0

@ MateuszUrbański vì vậy, nếu bạn đã có câu trả lời của bạn, hãy đưa ra một số tình yêu và đánh dấu câu trả lời đã chọn là chính xác –