Ruby on rails 通过sql查找返回activeRecords关系的内容

Ruby on rails 通过sql查找返回activeRecords关系的内容,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要通过sql查找以返回ActiveRecord::Relation对象。这似乎是不可能的。然后我想用纯ruby编写我的查询 我有一个与自身有关系的表: class Alarma < ApplicationRecord **belongs_to :root, class_name: "Alarma", foreign_key: "relacionada_id", optional: true has_many :children, class_name: "Alarma" , f

我需要通过sql查找以返回ActiveRecord::Relation对象。这似乎是不可能的。然后我想用纯ruby编写我的查询

我有一个与自身有关系的表:

class Alarma < ApplicationRecord
  **belongs_to :root, class_name: "Alarma", foreign_key: "relacionada_id", optional: true
  has_many :children, class_name: "Alarma" , foreign_key: "relacionada_id"**
这是我在sql中的查询:

  Alarma.find_by_sql("SELECT a1.*  FROM alarmas a1 LEFT OUTER JOIN alarmas a2 ON a1.relacionada_id=a2.id 
WHERE a1.estado_id IN (1,2) OR a2.estado_id IN (1,2)")
Alarma可以是根,然后它有子报警,或者它可以处于以下状态:estado_id=2表示它是子报警,并且有根报警(此报警是relacionada_id)

例如:

根警报,relacionada_id=null,id=99 儿童报警器,relacionada_id=99,id=112

我需要的是状态为estado_id=1或2的报警列表,以及其根所在状态为estado id 1或2(及其状态)的报警

我可以使用find_by_sql让它与我自己的sql查询一起工作,但它返回一个数组,我需要一个ActiveRecord::Relation对象,因为我需要继续处理结果(因为我使用分页gem,order和page方法不与数组一起工作)

请参见

诀窍是获取原始SQL语句结果的ID,并使用
where
执行第二次查询,因此它返回
ActiveRecord::Relation

as_array = Alarma.find_by_sql("SELECT a1.*  FROM alarmas a1 LEFT OUTER JOIN alarmas a2 ON a1.relacionada_id=a2.id WHERE a1.estado_id IN (1,2) OR a2.estado_id IN (1,2)")

as_relation = Alarma.where(id: as_array.map(&:id))

find_by_sql中的代码解决了我的问题。问题是我需要继续处理结果(使用gem进行分页和排序),这个结果应该是一个ActiveRecord关系。我没有Sql方面的经验,对于rails中的复杂查询,我可以在纯Sql中通过左外连接得到它。我不知道如何用rails的方式编写它。@Bri4n
Alaram
Estado
Relacionada
?我将我的问题编辑得更清楚一些。感谢@kavincatt这要求您将所有id加载到内存中,这相当低效。这里的另一个问题是,如果您在原始sql中有一些排序,将其转换为AR,它将用默认的排序范围覆盖它。
as_array = Alarma.find_by_sql("SELECT a1.*  FROM alarmas a1 LEFT OUTER JOIN alarmas a2 ON a1.relacionada_id=a2.id WHERE a1.estado_id IN (1,2) OR a2.estado_id IN (1,2)")

as_relation = Alarma.where(id: as_array.map(&:id))