2017-08-31 83 views
1

在Rails应用程序我有两个相关(如多对多)表 - 轨道如何使用原始SQL查询来模拟Active Record关联?

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

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; 

但有可能包装为方便其模特般的数据结构?

+0

为什么不只是创造艺术家的模式? 如果你担心表现,那么我想你想拥有这个模型。如果没有,那么数据库中的一些艺术家记录有什么危害,永远不会被清理干净。 (和可清洗相当easiliy,喜欢的东西:'Artist.includes(:轨)。凡({曲目:{ID:无}})。delete') – gernberg

+0

也许,你是对的。我不想拥有Artist模型的唯一原因是因为它会使手动审查数据变得更加复杂。有时候,Track表中的行被破坏 - 例如,它具有'artist:“Bob Dylan - 风中的Blowng”,track:“”'。但我可以通过稍微更复杂的连接查询来克服这种麻烦。 – vtambourine

回答

0

您可以通过映射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查询字符串)

相关问题