在一个查询中查询具有状态加上最后一个(无论什么状态)的所有记录

时间:2019-02-10 01:51:40

标签: mysql sql ruby-on-rails ruby

我有类似的东西:

(Model.where(status: :active).to_a << Model.last).uniq

我正在寻找一种方法来使它在单个查询中发生。有可能吗?

2 个答案:

答案 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'