2017-08-31 107 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查詢字符串)

相關問題