2016-04-11 16 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