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
  1. 为什么我第一次访问艺人协会的时候是这样

    my_song.artists

    执行新的 SQL 查询,尽管 "joins" 命令已经加载了艺术家列表?

  2. 第一次加载艺术家协会后(以便建立缓存),有没有办法过滤艺术家而无需再次加载他们? 因为

    my_song.artists.where(Id: 55)

    每次执行都会执行一个新的查询,即使有可用的缓存。

谢谢。

:joins 根本不加载关联 - 即 :includes(及其变体 :preload:eager_load

当你有关联时,使用关系方法(即从活动记录查询接口:whereincludesorder)总是会return一个新的关系(因此在使用时会触发新查询)。如果要使用加载的关联,使用detect.

等数组方法