【发布时间】:2023-03-04 23:07:02
【问题描述】:
在我的 Rails 4 应用程序中,我使用以下 SQL 'OR' 语句对我的模型之一进行了相当简单的搜索。它工作正常。有什么方法(和理由)可以在没有使用 Rails Active Record 查询接口的原始 SQL 的情况下实现这一点?
Activity.where("
user_id = ? OR
category = ? OR
(secondary_id = ? AND secondary_model = ?) OR
(tertiary_id = ? AND tertiary_model = ?)",
user_id, "Announcement", user_id, "user", user_id, "user"
).uniq
【问题讨论】:
-
如果还是这样的话,也许可以使用 Arel
-
你试过
ActiveRecord::Base.connection.execute吗?它应该可以解决您的问题。 -
你可以通过 AREL 来做,但我认为它不会更容易阅读。不过,切换到命名参数(
user_id = :user_id or ...参数带有哈希)是一个好主意,这将避免参数列表中的重复参数和顺序敏感性。 -
添加一个
group子句以使数据库的唯一性成为工作也是值得的 -
@Pavling:
uniq是一个 ActiveRecord 方法。 GROUP BY 用于聚合,而不是唯一性,将其用于唯一性是一种滥用,仅适用于某些数据库。
标签: sql ruby-on-rails postgresql activerecord