我需要find_by_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"**

这是表:
create_table "alarmas", force: :cascade do |t|
    t.string   "sysname"
    t.string   "component"
    t.string   "details"
    t.integer  "estado_id"
    t.integer  "relacionada_id"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
    t.index ["estado_id"], name: "index_alarmas_on_estado_id", using: :btree
    t.index ["severity_id"], name: "index_alarmas_on_severity_id", using: :btree
  end

这是我在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可以是root,然后具有子级警报,或者可能处于以下状态:estado_id = 2这意味着它是 child ,并且具有root警报(此警报是relacionada_id)。

例子:

根警报,relacionada_id = null,id = 99
child 警报,relacionada_id = 99,id = 112

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

我可以使用find_by_sql在我自己的sql查询中使用它,但是它返回一个数组,并且我需要一个ActiveRecord::Relation对象,因为我需要继续处理结果(因为我使用了分页gem,而order和page方法却没有这样做)与数组一起工作)

最佳答案

参见Converting an array of objects to ActiveRecord::Relation

诀窍是,您获取原始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))

关于ruby-on-rails - 将find_by_sql转换为可返回activeRecord关系的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43326662/

10-12 12:54
查看更多