2010-02-11 24 views
8

Tôi đang làm việc trên một ứng dụng có một vài mô hình khác nhau (vé, bài đăng, báo cáo, v.v.). Dữ liệu khác nhau trong mỗi mô hình và tôi muốn tạo "nguồn cấp dữ liệu" từ tất cả các mô hình đó hiển thị 10 mục gần đây nhất trên bảng (một kết hợp của tất cả dữ liệu).Tạo "nguồn cấp dữ liệu" từ nhiều mô hình Rails khác nhau

Cách tốt nhất để giải quyết vấn đề này là gì? Tôi có nên tạo mô hình Nguồn cấp dữ liệu mới và ghi vào bảng đó khi người dùng được chỉ định một vé hoặc một báo cáo mới được đăng không? Chúng tôi cũng đã xem xét STI để xây dựng một bảng tham chiếu mô hình hoặc chỉ tạo một phương thức lớp tổng hợp dữ liệu. Không chắc chắn phương pháp nào hiệu quả nhất ...

Trả lời

6

Bạn có thể làm điều đó một trong hai cách tùy thuộc vào yêu cầu hiệu quả.

Phương pháp kém hiệu quả là để lấy 10 * N mục và sắp xếp và giảm theo yêu cầu:

# Fetch 10 most recent items from each type of object, sort by 
# created_at, then pick top 10 of those. 
@items = [ Ticket, Post, Report ].inject([ ]) do |a, with_class| 
    a + with_class.find(:all, :limit => 10, :order => 'created_at DESC') 
end.sort_by(&:created_at).reverse[0, 10] 

Phương pháp khác là tạo ra một bảng chỉ số đó là đã nhận một hiệp hội đa hình với các hồ sơ khác nhau. Nếu bạn chỉ quan tâm đến hiển thị 10 tại một thời điểm bạn có thể prune mạnh mẽ này bằng cách sử dụng một số loại công việc cào để giới hạn nó đến 10 cho mỗi người dùng, hoặc phạm vi nào là bắt buộc.

+0

Điều này hoạt động tốt và dường như đang chuyển động khá nhanh. Tôi đã cố gắng tránh tạo ra một mô hình khác. Cảm ơn. – jsiarto

+2

hey tadman, đối với những người trong chúng ta quan tâm đến tùy chọn thứ hai, tôi đã viết một câu hỏi tiếp theo ở đây: http://stackoverflow.com/questions/7841553/creating-a-feed-from-multiple-rails-models-efficiently Nếu bạn có một chút thời gian, bạn có thể kiểm tra theo dõi không? – jay

0

Tạo mô hình mặt hàng bao gồm các thuộc tính "table_name" và "item_id". Sau đó, tạo một phần cho từng loại dữ liệu. Sau khi bạn lưu, giả sử, một vé, tạo ra một mục Ví dụ:

i = Item.create(:table_name => 'tickets', :item_id => @ticket.id) 

Trong items_controller của bạn:

def index 
    @items = Item.find(:all, :order => 'created_on DESC') 
end 

Trong views/mục/index.erb:

<% @items.each do |item| %> 
    <%= render :partial => item.table_name, :locals => {:item => item} %><br /> 
<% end %> 
+0

Điều này có vẻ là một cách thủ công hơn khi chỉ thực hiện STI, có lợi thế nào để lưu trữ tên_bảng, thay vì nhập và chỉ cho phép các thanh ray xử lý STI không? – jsiarto

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