joins() 和 where() 请求与自定义表名关联

Que*_*tin 5 activerecord ruby-on-rails

我有两个型号

专辑.rb

class Album < ActiveRecord::Base
  has_many :tracks
  self.table_name = 'prefix_album'
end
Run Code Online (Sandbox Code Playgroud)

轨道.rb

class Track < ActiveRecord::Base
  belongs_to :album
  self.table_name = 'prefix_track'
end
Run Code Online (Sandbox Code Playgroud)

现在,由于原因,表名带有前缀,所以我的数据库中有prefix_album和表。prefix_track对于基本使用来说,效果很好。

现在出现以下查询的问题:

Album.joins(:tracks).where(tracks: { id: [10, 15] })
Run Code Online (Sandbox Code Playgroud)

结果如下 SQL:

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

失败是因为WHERE "tracks"."id"应该是WHERE "prefix_tracks"."id"。知道为什么 active_record 能够获取正确的表名.joins(:tracks)但不能获取正确的表名.where(tracks: {})吗?

无论如何,我已经想到了这个锻炼:Album.joins(:tracks).merge(Track.where(id: [10,15]))它给出了相同的结果并且有效。

但我想知道为什么前者不起作用

Muh*_*Ali 2

尝试一下:

Album.joins(:tracks).where(prefix_tracks: { id: [10, 15] })
Run Code Online (Sandbox Code Playgroud)

您可以添加table_name到模型中,例如:

class Album < ActiveRecord::Base
  self.table_name = "prefix_album"
end
Run Code Online (Sandbox Code Playgroud)