Rails& ActiveRecord复杂查询。如果存在这些子对象,则基于子对象进行排序

时间:2016-09-20 18:33:50

标签: ruby-on-rails activerecord

我有3个模型:User,Event和UserEvent。

class Event
  has_many :user_events
  has_many :users :through => :user_events
end

class User
  has_many :user_events
  has_many :events, :through => :user_events
end

UserEvent有3列:user_idevent_idrelevance(浮点)。每小时为每个用户在后台作业中计算Relevance。每个用户应该为每个事件准备一个UserEvent。

在我的活动索引页面上,我想显示按其与该特定用户的相关性排序的事件列表。

Event.includes(:event_rankings)
  .where("event_rankings.user_id = ?", current_user.id)
  .order("event_rankings.relevance DESC")

我面临的问题是,当用户在注册后立即访问事件索引页面时,上述查询将返回0结果,因为该用户在后台作业运行之前没有UserEvents。但是如果没有“where”子句,它将从其他用户返回不相关的UserEvent。

有没有办法构造这个查询,以便按用户的user_events.relevance排序,如果它们存在,但按日期排序?我想一个简单的方法是if / else执行不同的查询,但我想知道是否有一个查询执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以尝试类似

的内容
Event.includes(:event_rankings)
  .where("event_rankings.user_id = ?", current_user.id)
  .order("event_rankings.#{event_rankings.relevance.empty? ? "date" : "relevance"} DESC")

我正在使用带条件的字符串插值。因此,如果relevance为空,则会调用order("event_rankings.date DESC"),否则会调用order(event_rankings.relevance DESC")