我需要find_by_sql来返回一个ActiveRecord :: Relation对象。这似乎是不可能的。然后我想用纯红宝石写我的查询。
我有一张与自己有关系的桌子:
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表示它是一个孩子,并且有一个根警报,(此警报是relacionada_id)。
示例:
Root alarm,relacionada_id = null,id = 99 儿童警报,relacionada_id = 99,id = 112
我需要的是状态为estado_id = 1或2的警报列表,以及他的root状态为estado id 1或2(及其状态)的警报
我可以使用find_by_sql使用我自己的sql查询,但它返回一个数组,我需要一个ActiveRecord :: Relation对象,因为我需要继续使用结果(因为我使用了一个分页宝石和顺序和页面方法不适用于数组)
答案 0 :(得分:6)
请参阅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))