我有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_id
,event_id
和relevance
(浮点)。每小时为每个用户在后台作业中计算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执行不同的查询,但我想知道是否有一个查询执行此操作。
答案 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")