我有类似的东西:
(Model.where(status: :active).to_a << Model.last).uniq
我正在寻找一种方法来使它在单个查询中发生。有可能吗?
答案 0 :(得分:0)
我认为您不能使用单个查询,也许您可以使用嵌套子查询进行查询,但仅使用ActiveRecord(也许使用Arel)就无法做到这一点。
我个人将使用2个ActiveRecord查询,一个用于获取las记录的ID,然后是实际查询:
last_id = Model.last.id
records = Model.where(status: active).or(Model.where(id: last_id))
您将有2个查询,但是第一个查询确实会折旧,第二个查询比将所有结果转换为数组并执行uniq
快得多。
答案 1 :(得分:0)
您可以使用普通SQL构造查询,然后使用ActiveRecord#find_by_sql
获取ActiveRecord对象数组:
query = <<-SQL
SELECT * FROM subscriptions
WHERE
status = 'active' OR
id = (SELECT max(id) FROM subscriptions)
SQL
Subscription.find_by_sql(query) #=> [ array of subscriptions]
如果需要ActiveRecord :: Relation实例,请使用ActiveRecord#from
方法。它允许将普通的SQL传递到FROM语句中。由于#from
返回关系,因此您可以使用所有Active Record方法进行查询
Subscription.from(query).where('created_at > ?', Time.zone.now)
它会像这样构建单个查询:
SELECT * FROM (
SELECT * FROM subscriptions
WHERE
status = 'active' OR
id = (SELECT max(id) FROM subscriptions)
) WHERE created_at > '2019-01-01 00:00'