Rails ActiveRecord 关联缓存问题
Rails ActiveRecord associations caching questions
在 Rails 中,当有 ActiveRecord 关联时,说:
class Song < ActiveRecord::Base
has_many :artists_songs, :class_name => "ArtistSong"
has_many :artists, :class_name => "Artist", :through => :artists_songs
end
class Artist< ActiveRecord::Base
has_many :artists_songs, :class_name => "ArtistSong"
has_many :songs, :class_name => "Song", :through => :artists_songs
end
class ArtistSong < ActiveRecord::Base
belongs_to :song, :class_name => "Song"
belongs_to :artist, :class_name => "Artist"
end
然后说我访问这样的歌曲
my_song = Song.joins(:artists).first
为什么我第一次访问艺人协会的时候是这样
my_song.artists
执行新的 SQL 查询,尽管 "joins" 命令已经加载了艺术家列表?
第一次加载艺术家协会后(以便建立缓存),有没有办法过滤艺术家而无需再次加载他们?
因为
my_song.artists.where(Id: 55)
每次执行都会执行一个新的查询,即使有可用的缓存。
谢谢。
:joins
根本不加载关联 - 即 :includes
(及其变体 :preload
和 :eager_load
当你有关联时,使用关系方法(即从活动记录查询接口:where
、includes
、order
)总是会return一个新的关系(因此在使用时会触发新查询)。如果要使用加载的关联,使用detect
.
等数组方法
在 Rails 中,当有 ActiveRecord 关联时,说:
class Song < ActiveRecord::Base
has_many :artists_songs, :class_name => "ArtistSong"
has_many :artists, :class_name => "Artist", :through => :artists_songs
end
class Artist< ActiveRecord::Base
has_many :artists_songs, :class_name => "ArtistSong"
has_many :songs, :class_name => "Song", :through => :artists_songs
end
class ArtistSong < ActiveRecord::Base
belongs_to :song, :class_name => "Song"
belongs_to :artist, :class_name => "Artist"
end
然后说我访问这样的歌曲
my_song = Song.joins(:artists).first
为什么我第一次访问艺人协会的时候是这样
my_song.artists
执行新的 SQL 查询,尽管 "joins" 命令已经加载了艺术家列表?
第一次加载艺术家协会后(以便建立缓存),有没有办法过滤艺术家而无需再次加载他们? 因为
my_song.artists.where(Id: 55)
每次执行都会执行一个新的查询,即使有可用的缓存。
谢谢。
:joins
根本不加载关联 - 即 :includes
(及其变体 :preload
和 :eager_load
当你有关联时,使用关系方法(即从活动记录查询接口:where
、includes
、order
)总是会return一个新的关系(因此在使用时会触发新查询)。如果要使用加载的关联,使用detect
.