2010-01-20 20 views
10

Làm cách nào để hợp nhất các mô hình để tôi có thể có 10 Bài đăng, Mục nhập nguồn cấp dữ liệu và Tin nhắn riêng được hiển thị theo thứ tự?"hợp nhất" nhiều mô hình. Để tạo hộp "hoạt động gần đây"

bài viết được lưu trữ trong "Đăng" mô hình và ra lệnh trên "created_at"

Feed Entries được lưu trữ trong "Planet" và ra lệnh trên "published_at"

Nhắn tin được lưu trữ trong "Message" và cần phải được lọc với:

:conditions => "receiver_id = #{current_user.id}" 

và ra lệnh trên "created_at"

Trả lời

11

Bạn cần phải:

  1. yếu tố truy vấn cho từng mô hình
  2. hợp chúng trong một định dạng phổ biến
  3. sắp xếp và hạn chế

Dưới đây là một số mã:

class Activity < Struct.new(:title, :text, :date); end 

limit = 10 
activities = [] 
activities += Post.all(:order => 'created_at DESC', :limit => limit).map do |post| 
    Activity.new(post.title, post.summary, post.created_at) 
end 

activities += Planet.all(:order => 'published_at DESC', :limit => limit).map do |planet| 
    Activity.new(planet.title, planet.message, planet.published_at) 
end 

activities += Message.all(:conditions => ['receiver_id = ?', current_user.id], :order => 'created_at DESC', :limit => limit).map do |message| 
    Activity.new(message.title, message.text, message.created_at) 
end 

# descending sort by 'date' field 
sorted_activities = activities.sort_by(&:date).reverse 

# 10 most recent elements across all models 
@activities = sorted_activities[0..(limit-1)] 

Tất nhiên, tùy thuộc vào mô hình của bạn, bạn sẽ phải thay đổi phương pháp được sử dụng như "title" hoặc "văn bản".

Nhưng nếu bạn cần nhiều thành ngữ như vậy, bạn nên sử dụng Thừa kế bảng đơn như chúng tôi thực hiện trong zena (CMS đường ray).

+0

im có vấn đề với việc phân loại, dường như gộp tất cả Các bài viết được chia theo thứ tự sau đó có tất cả các hành tinh cùng nhau để thay thế cho việc trộn chúng – Arcath

+0

Sử dụng #sort_by thay vào đó: activities.sort_by (&: created_at) .reverse [0, limit] –

+0

cảm ơn, nó cần phải là '@ activites = activity .sort_by (&: date) .reverse [0, limit] 'using: date để trường của nó trong lớp Activity – Arcath

11

tôi sẽ sử dụng một lớp Proxy. Lớp có thể lưu trữ tham chiếu đối tượng ActiveRecord và trường để sắp xếp.

class ActivityProxy 
    attr_accessor :object, :date 
    def initialize(object, date) 
    self.object = object 
    self.date = date 
    end 
end 

Sau đó, bạn tải các đối tượng của mình.

activity = [] 
activity += Post.all(:limit => 10, :order => "created_at DESC").map { |post| ActivityProxy.new(post, post.created_at) } 
# and so on with the other objects 

Cuối cùng bạn sắp xếp các đối tượng

activity.sort_by(&:field) 
# => here you have the sorted objects 
# and you can iterate them with 
activity.each do |proxy| 
    proxy.object.id 
    # ... 
end 
+0

Mảng hoạt động dường như trống, tôi không nhận được bất kỳ lỗi nào chỉ là một mảng trống ở cuối của nó – Arcath

+0

Thay đổi '+' thành '+ =' –

1

Một phương pháp khác để tạo nguồn cấp dữ liệu là tạo một VIEW kết hợp cả hai để cho chế độ xem có mô hình riêng.

+1

Để được giải thích, xem: https: // dan. chak.org/enterprise-rails/chapter-11-view-backed-models/ –

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