我有这种情况。
现在我最初将此关系表达为
# in C
belongs_to :B, class_name: "B", foreign_key: "parent_id", inverse_of: :schools
has_many :own_special_users, -> { User.special_users }, through: :users
has_many :parent_special_users, through: :district, source: :special_users
def special_users
own_special_users + parent_special_users
end
这就是B的样子
# in B
has_many :cs, class_name: "C", foreign_key: "parent_id"
这就是A的样子
has_many :special_users, -> { User.special_users }, through: :special_users
现在这个工作了!然而,eagerloading没有工作。我知道这个的原因是因为我做了
ActiveRecord::Associations::Preloader.new.preload(instances_of_a, [:special_users])
通过rails控制台中的ActiveLogger,没有执行任何操作(我认为这意味着预加载器实际上没有执行SQL? - 我是ActiveRecord的新手)。我也知道它没有用,因为我有perf测试来计算执行的sql查询的数量,而且我在这个变化的任何地方都有额外的东西(查看堆栈跟踪)。
我确实认为,因为之前的预加载工作 - 在A中表达这种关系可能更好。
所以我有两个问题
谢谢 - 如果不清楚也让我知道 - 我知道它很复杂,可能需要更多背景信息。