使用STI进行ActiveRecord eagerloading

时间:2016-11-26 22:57:15

标签: ruby-on-rails ruby activerecord

我有这种情况。

  1. A型。
  2. 继承自A。
  3. 的模型B和C.
  4. C有一个属性,parent_id指向B。
  5. B的parent_id属性为nil。
  6. B和C都有特殊用户。
  7. C的特殊用户是它拥有的特殊用户和B的特殊用户。
  8. 现在我最初将此关系表达为

    # 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中表达这种关系可能更好。

    所以我有两个问题

    1. 为什么预加载/预加载不能与我表达的关系一起工作?
    2. 我如何仅在A?
    3. 中表达上述内容

      谢谢 - 如果不清楚也让我知道 - 我知道它很复杂,可能需要更多背景信息。

0 个答案:

没有答案