在Rails应用程序中,我有两个相关的(与许多)表相关联 - 卷和 tracks 。
卷是广播节目情节的集合。每个情节都有多个轨道。但是每个曲目都可以出现在许多节目中。
卷:
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
。
问题是我没有 Artist 模型。而且不想创建它,因为我相信它会使手动数据清理更加困难。
例如,我可以查询我需要的数据:
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;
但是是否可以包装它类似于模型的数据结构,以便于访问?
您可以将SQL查询返回的每个结果映射到结构,这可能使您可以易于访问。这样的东西:
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查询字符串)