如何使用原始SQL查询模仿Active Record关联?

时间:2017-08-31 21:09:08

标签: sql ruby-on-rails

在Rails应用程序中,我有两个关联(尽可能多的)表 - 轨道

是电台节目集的集合。每集都有多个曲目。但每首曲目都可以出现在很多节目中。

 id  |         title
-----+-----------------------
 23  | Oldstyle
 24  | How to stop worrying

轨道

  id  |        artist        |         title
------+----------------------+------------------------
 4764 | John Lennon          | Mind Games
 4765 | George Harrison      | All Those Years Ago
 4766 | Paul McCartney       | Here Today

我需要的是按艺术家聚合曲目并显示该艺术家跟踪的所有节目音量。类似于Artist.select(name: 'Beatles').volumes

问题是我没有艺术家模型。并且不想创建它,因为我相信它会使手动数据清理更加困难。

例如,我可以查询我需要的数据:

SELECT DISTINCT t.artist, v.number
FROM tracks t
JOIN volumes_tracks vt ON vt.track_id = t.id
JOIN volumes v ON v.id = vt.volumes_id
GROUP BY artist, number;

但它是否可以将其包装为类似模型的数据结构以便于访问?

1 个答案:

答案 0 :(得分:0)

您可以将sql查询返回的每个结果映射到Struct,这可能会让您轻松访问您正在寻找的内容。像这样:

   Artist = Struct.new(:artist, :volume_id)  
   result=ActiveRecord::Base.connection.execute(sql)
   artists = result.map{|r| Artist.new(r['t.artist'], r['v.id']}
   first_artist = artists[0].artist

(sql变量代表你的sql查询字符串)