Scoping/Combining 个集合并对其进行排序(Public Activity Gem 在 rails 4 上)

Scoping/Combining collections and ordering them ( Public Activity Gem on rails 4)

我正在使用PublicActivityGem创建通知系统sorts.Before我陈述我的问题,我会提供相关代码:

活动的控制器操作:

 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

活动视图#index

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

我的目标是收集要在索引视图上显示的所有相关活动。但是,会发生如下情况:

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)

首先,呈现所有者 Article 的活动,然后呈现所有者 User 的活动。我希望它们都按 order(:created_at) 呈现,最好按降序呈现,不管它们的所有者类型是什么。有没有更好的方法来实现这一目标?

您可以将两个查询合并为一个查询,让数据库进行排序。

您需要做的是 OR 查询。

如果您使用 Rails 5(测试版或 rc),您可以使用 or 方法来实现:

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)

如果您使用的是旧版本的 Rails,您可以使用强大的 Arel 来执行 Or 查询。在您的情况下,代码如下:

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

您可以将其重构为您的 PublicActivity::Activity 模型。