我有以下范围,我知道这不是最佳范围:

scope :event_stream_for, lambda{ |user|
  where("target_id in (?) and target_type = ?", user.events.collect(&:id), "Event")
}


这将创建3个查询。我该如何优化?

另外,如何将整个sql语句放在范围的lambda中,例如

SELECT * FROM activities WHERE target_type =='Event' AND target_id IN (SELECT DISTINCT id FROM events WHERE (host_id == user.id OR invitee_id == user.id))

谢谢

最佳答案

假设用户有很多事件,并且每个事件都属于一个用户。

scope :event_stream_for, lambda{ |user
  joins(:events). # or joins("LEFT JOIN events ON events.user_id = users.id").
  where(["target_type=?", "Event"])
}


这将运行一个查询。尚未在您的表中测试过我的代码,但是它应该可以类似地工作。

-----------------------根据您编辑的问题-------------------

SELECT * FROM activity where where target_type =='Event'AND target_id IN(从事件wherewhere中选择DISTINCT id(host_id == user.id或Invitatione_id == user.id))

全部与ActiveRecord关系有关,http://railscasts.com/episodes/239-activerecord-relation-walkthrough?view=asciicast

Activity.
select("*,distinct events.id AS events_id").
joins("events ON (events.host_id = #{user.id} OR events.invitee_id = #{user.id}").
where(:target_type => 'Event')


在控制台上尝试一下,如果可行,您只需将其更改为作用域即可。
由于我不确定您要做什么,因此您可能需要进行一些调整。

09-20 13:14