我有以下范围,我知道这不是最佳范围:
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')
在控制台上尝试一下,如果可行,您只需将其更改为作用域即可。
由于我不确定您要做什么,因此您可能需要进行一些调整。