gpt4 book ai didi

sql - Rails ActiveRecord 中的复杂连接

转载 作者:行者123 更新时间:2023-12-05 01:30:06 25 4
gpt4 key购买 nike

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

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 事件 WHERE target_type =='Event' AND target_id IN (SELECT DISTINCT id FROM events WHERE (host_id == user.id OR prompte_id == user.id))

都是关于 ActiveRecord Relation, 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')

在控制台上试试这个,如果它有效,你可以简单地将它更改为范围。
由于我不确定您要做什么,因此您可能需要进行一些调整。

关于sql - Rails ActiveRecord 中的复杂连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9986375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com