2016-04-11 33 views
2

我有兩個型號連接()和自定義表名的關聯,其中()請求

Album.rb

class Album < ActiveRecord::Base 
    has_many :tracks 
    self.table_name = 'prefix_album' 
end 

Track.rb現在

class Track < ActiveRecord::Base 
    belongs_to :album 
    self.table_name = 'prefix_track' 
end 

,因爲原因,表名是前綴,所以我有我的數據庫中的prefix_albumprefix_track表SE。基本使用,它工作正常。現在

的問題,下面的查詢:

Album.joins(:tracks).where(tracks: { id: [10, 15] }) 

結果在下面的SQL:

SELECT * FROM "prefix_albums" INNER JOIN "prefix_tracks" ON "prefix_tracks"."album_id" = "prefix_albums"."id" WHERE "tracks"."id" IN (10, 15) 

哪些失敗了,因爲WHERE "tracks"."id"應該是WHERE "prefix_tracks"."id"。任何想法爲什麼active_record能夠獲得正確的表名.joins(:tracks)但不是.where(tracks: {})

無論如何,我已經想出了這個鍛鍊:Album.joins(:tracks).merge(Track.where(id: [10,15]))它給出了相同的結果和作品。

但我想知道爲什麼以前沒有工作

+1

嘗試'專輯.joins(:tracks).where(prefix_tracks:{id:[10,15]})' – Pavan

回答

1

試試看喜歡:

Album.joins(:tracks).where(prefix_tracks: { id: [10, 15] }) 

您可以添加table_name像模型:

class Album < ActiveRecord::Base 
    self.table_name = "prefix_album" 
end 
+0

是的,但它只是另一種解決方法,而且不穩定(如果更改表名的設置,它將會中斷) – Quentin

+0

然後將'table_name'添加到模型中,它將從一個地方起作用。 –

+0

'table_name'已經設置爲模型 – Quentin