Ruby on rails 通过sql查找返回activeRecords关系的内容
我需要通过sql查找以返回ActiveRecord::Relation对象。这似乎是不可能的。然后我想用纯ruby编写我的查询 我有一个与自身有关系的表: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
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))