仅在符合某些条件的情况下选择表格列

时间:2019-10-16 09:13:03

标签: ruby-on-rails ruby

Rails 5.2 ruby​​ 2.6

大家好,

我有一个具有状态和updated_at created_at列的模型(也有其他几列)。可能的状态值可以是“待处理”,“途中”,“已完成”。

我要查询该表,以便:

  • 所有记录的状态必须为“待定”,“途中”和“已完成”。
  • 如果状态为“已完成”,则其update_at必须在最近的24小时内。
    • 不应选择状态为“已完成”且时间戳不同的所有其他记录。
@result =
  Model1.includes(Model2: [:model3, :model4, :model5, :model6])
        .where(conditions)
        .where('Model1.status = ? AND Model1.updated_at > ?', 'Completed', 24.hours.ago)
        .order('Model1.created_at DESC') 

以上是活动记录查询的示例结构。该查询仅在最近24小时内完成打印。但不会收集其他所有状态。

3 个答案:

答案 0 :(得分:1)

includes(Model2: [:model3, :model4, :model5, :model6])
               .where(conditions)
               .where('(Model1.status = ? AND Model1.updated_at > ?) OR ( Model1.status != ?)', "Completed", 24.hours.ago, "Completed")
               .order('Model1.created_at DESC')

答案 1 :(得分:1)

所以您基本上需要这个:

Model.where('Completed', 24.hours.ago)
     .or(Model.where(status: ['pending', 'enroute']))

答案 2 :(得分:0)

您可以执行以下操作

Model.where('Model1.status = ? AND Model1.updated_at > ?', 'Completed', 24.hours.ago)
     .or(Model.where(status: ['pending', 'enroute']))

或者您可以通过Arel

model = Model.arel_table
arel1 = model[:status].eq('Completed').and(model[:updated_at].gteq(24.hours.ago))
arel2 = model[:status].in(['pending', 'enroute'])

Model.where(arel1.or(arel2))