gpt4 book ai didi

ruby-on-rails - 在 OR 而不是 AND 上合并 2 个关系

转载 作者:行者123 更新时间:2023-12-02 03:56:34 25 4
gpt4 key购买 nike

我有这两段代码,每段代码都返回 Micropost 模型内的一个关系。

scope :including_replies, lambda { |user| where("microposts.in_reply_to = ?", user.id)}

def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end

当我运行 r1 = Micropost.including_replies(user) 时,我使用以下 SQL 得到了两个结果的关系:

SELECT `microposts`.* FROM `microposts` WHERE (microposts.in_reply_to = 102) ORDER BY 
microposts.created_at DESC

当我运行 r2 = Micropost.from_users_followed_by(user) 时,我通过以下 SQL 获得了与一个结果的关系:

SELECT `microposts`.* FROM `microposts` WHERE (user_id IN (NULL) OR user_id = 102) ORDER 
BY microposts.created_at DESC

现在,当我像这样合并关系时 r3 = r1.merge(r2) 我得到了零个结果,但我期待三个。这样做的原因是 SQL 看起来像这样:

SELECT `microposts`.* FROM `microposts` WHERE (microposts.in_reply_to = 102) AND 
(user_id IN (NULL) OR user_id = 102) ORDER BY microposts.created_at DESC

现在我需要的是 (microposts.in_reply_to = 102) OR (user_id IN (NULL) OR user_id = 102)我需要一个 OR 而不是合并关系中的 AND

有办法吗?

最佳答案

不直接使用 Rails。 Rails 没有提供任何方法来将 ActiveRelation(作用域)对象与 OR 合并。原因是 ActiveRelation 可能不仅包含条件(在 WHERE 子句中描述的内容),而且还包含连接和其他 SQL 子句,其中不能很好地与 OR 合并-定义。

您可以直接使用 Arel(ActiveRelation 建立在 Arel 之上)或使用 Squeel 来完成此操作,它通过 DSL(可能更方便)公开 Arel 功能。对于 Squeel,不能合并 ActiveRelations 仍然是相关的。然而,Squeel 还提供了 Sifters ,它表示您可以使用的条件(没有任何其他 SQL 子句)。不过,这将涉及将作用域重写为筛选器。

关于ruby-on-rails - 在 OR 而不是 AND 上合并 2 个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12310962/

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