我正在使用公共活动Gem创建一个排序通知系统。在我说明我的问题之前,我将提供相关代码:
活动的控制器操作:
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)
首先,呈现所有者文章的活动,然后呈现所有者用户的活动。我希望它们都按顺序呈现(:created_at),最好按降序排列,尽管它们的所有者类型是什么。有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
您可以将两个查询合并为一个查询,让数据库执行排序。
您需要做的是OR
查询。
如果您使用的是Rails 5(beta或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
模型。