2016-06-17 2 views
0

Ich bin mit der öffentlichen Aktivität Gem Bestellung ein Benachrichtigungssystem von sorts.Before erstellen ich mein Problem angeben, werde ich den entsprechenden Code zur Verfügung stellen:Scoping/Kombinieren von Sammlungen und sie (Public Aktivität Gem auf Schienen 4)

Die Controller-Aktion für Aktivitäten:

def index 
    @activities1 = PublicActivity::Activity.where(owner_id: current_user.articles, owner_type: "Article") 
    @activities2 = PublicActivity::Activity.where(owner_id: current_user.id , owner_type: "User") 
    @activities = @activities1 + @activities2 
    @activities.sort_by{ |a| a[:created_at] } 
    end 

The View für Aktivitäten # Index

<% @activities.each do |activity| %> 
    <%= render_activity activity %> 
<% end %> 

Mein Ziel ist es, eine Zusammenarbeit zu haben, Auswahl aller relevanten Aktivitäten, die ich in der Indexansicht anzeigen möchte. Doch so etwas wie das passiert folgendes:

1) Activity filler text(Created June 1) (Owner: Article) 
2) Activity filler text (Created June 3) (Owner: Article) 
3) Activity filler text (Created June 4) (Owner: Article) 
4) Activity filler text (Created June 1) (Owner: User) 
5) Activity filler text (created June 2) (Owner: User) 

Zunächst werden die Aktivitäten mit dem Eigentümer Artikel erbracht werden, dann nach, dass sich die Aktivitäten mit dem Eigentümer Benutzer gerendert werden. Ich möchte, dass alle in der Reihenfolge (: created_at) gerendert werden und vorzugsweise in absteigender Reihenfolge, ungeachtet dessen, was ihr Typ ist. Gibt es einen besseren Weg, dies zu erreichen?

Antwort

1

Sie könnten die beiden Abfragen in einer einzigen Abfrage kombinieren und die Datenbank sortieren lassen.

Was Sie brauchen, ist eine OR Abfrage.

Wenn Sie Rails 5 (Beta oder RC) verwenden, könnten Sie or Methode verwenden, um das zu erreichen:

PublicActivity::Activity.where(owner_id: current_user.articles, owner_type: "Article"). 
    or(PublicActivity::Activity.where(owner_id: current_user.id , owner_type: "User")).order(id: :desc) 

Wenn Sie ein verwenden ältere Version von Rails, könnten Sie leistungsstarke Arel verwenden, um eine Or Abfrage durchzuführen. In Ihrem Fall ist, hier der Code:

PublicActivity::Activity.where(article_activities.or(user_activities)).order(:id, :desc) 

def arel_table 
    PublicActivity::Activity.arel_table 
end 

def article_activities 
    arel_table[:owner_id].in(current_user.acticles.map(&:id)). 
    and(arel_table[:owner_type].eq("Article")) 
end 

def user_activities 
    arel_table[:owner_id].eq(current_user.id). 
    and(arel_table[:owner_type].eq("User")) 
end 

Sie können dieser PublicActivity::Activity Modell Ihres Refactoring.

+0

Super! Vielen Dank! – kpaul

+0

Gern geschehen. :) –

Verwandte Themen