Rails活动记录,链接丢失范围

时间:2020-07-02 10:12:02

标签: ruby-on-rails ruby activerecord

模型@Valid ModeRequestTwo的范围为Food

Food.rb

expired

在我的控制器中,我根据用户和状态来链接过滤食物的条件:

query_type.rb

class Food < ApplicationRecord
  default_scope { where.not(status: 'DELETED') }
  scope :expired, -> { where('exp_date <= ?', DateTime.now) }
  belongs_to :user
end

这是rails日志:

def my_listing_connection(filter)
  user = context[:current_user]
  scope = Food.where(user_id: user.id)
  if filter[:status] == 'ARCHIVED'
    # Line 149
    scope = scope.where(
      Food.expired.or(Food.where(status: 'COMPLETED'))
    )
  else
    scope = scope.where(status: filter[:status])
  end
  scope.order(created_at: :desc, id: :desc)
  # LINE 157
  scope
end

为什么活动记录查询在第157行中丢失了Food Load (2.7ms) SELECT `foods`.* FROM `foods` WHERE `foods`.`status` != 'DELETED' AND ((exp_date <= '2020-07-02 09:58:16.435609') OR `foods`.`status` = 'COMPLETED') ↳ app/graphql/types/query_type.rb:149 Food Load (1.6ms) SELECT `foods`.* FROM `foods` WHERE `foods`.`status` != 'DELETED' AND `foods`.`user_id` = 1 ORDER BY `foods`.`created_at` DESC, `foods`.`id` DESC ↳ app/graphql/types/query_type.rb:157 范围(和条件)?

1 个答案:

答案 0 :(得分:2)

它被忽略,因为where不需要这样的范围。但是您可以改用merge。替换

scope = scope.where(
  Food.expired.or(Food.where(status: 'COMPLETED'))
)

使用

scope = scope.merge(Food.expired)
             .or(Food.where(status: 'COMPLETED'))

scope = scope.where(status: 'COMPLETED').or(Food.expired)
相关问题