Ruby on rails 带或运算符的ActiveRecord查询

Ruby on rails 带或运算符的ActiveRecord查询,ruby-on-rails,activerecord,arel,Ruby On Rails,Activerecord,Arel,我有ActiveRecordmodel类,作用域如下 scope :acknowledgeable, -> { with_message.where(messages: { acknowledgeable: true }) } scope :acknowledged, -> { acknowledgeable.where.not(acknowledged_at: nil) } scope :not_acknowledged, -> { acknowledgeable.where

我有
ActiveRecord
model类,作用域如下

scope :acknowledgeable, -> { with_message.where(messages: { acknowledgeable: true }) }
scope :acknowledged, -> { acknowledgeable.where.not(acknowledged_at: nil) }
scope :not_acknowledged, -> { acknowledgeable.where(acknowledged_at: nil) }
scope :not_read, -> do
  message_statuses = MessageStatus.arel_table
  messages = Message.arel_table
  GuestMessageStatus.joins(:message).where(
    message_statuses[:read_at].eq(nil)
    .or(
      messages[:acknowledgeable].eq(true)
      .and(message_statuses[:read_at].eq(nil))
      .and(message_statuses[:acknowledged_at].eq(nil)))
 )
end
范围
未读
是我关注的对象。基本上,它可以正常工作。它能用更优雅、更简单的方式书写吗?我不想用原始SQL编写它。状态消息在以下情况下被视为已读:

if status.message.acknowledgeable?
  status.read_at.nil? && status.acknowledged_at.nil?
else
  status.read_at.nil?
end

我不想用原始SQL编写它
。为什么?使用SQL字符串编写
where
条件的一部分并没有错。速度更快,你对结果有了更好的视觉效果。西蒙娜·卡莱蒂,你说得对。我完全同意你的观点。但我想知道,如果不在其中硬编码SQL,是否/如何重写它。我不擅长Arel,写“或”的疑问总是让我产生心理问题——哪种方法是正确的。如果我需要使用一些SQL函数,如
DATE\u FORMAT
,那么SQL最适合我。您可以查看此gem:或在ARel上创建一个抽象: