新手问题 eager_load 用到了 left outer join,怎么可以设置里面的 on 条件呢

selenium · 2019年04月12日 · 最后由 selenium 回复于 2019年04月13日 · 336 次阅读

User.eager_load(:group)

这条语句的 on条件是 group.user_id = user.id 我想在加一个条件 group.type = 'XXX', 其实数据可以取出来再筛选但是这么做就有点多余了

left_joins 这个方法怎么传入on呢

共收到 5 条回复
User.eager_load(:group).where(group: {type: 'XXX'})

试试这样?

假设你的ActiveRecord是这样的:

class User < ActiveRecord::Base
  has_one :group
end
class Group< ActiveRecord::Base
  belongs_to :user
end

现在可以这么写:

class User < ActiveRecord::Base
  has_one :group, proc{Group.type_xxx}
end
class Group< ActiveRecord::Base
  belongs_to :user
  scope :type_xxx, proc{where "group.type = 'XXX'"}
end

现在User.eager_load(:group),会实现楼主想要的效果,把Group scope里的where条件在left outer join的时候加到on条件里

不过注意scope :type_xxx, proc{where "group.type = 'XXX'"} where里面的group实际应该为Group 数据库的表名

tinyfeng 回复

这个方法昨天我也看了,但是我这个需求需要传参进去,有什么办法传参进去吗

selenium 回复

join条件动态变化的话,eager_load应该做不到

tinyfeng 回复

恩,我现在自己拼接SQL 了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册