首先我有这个:
has_one :guess
scope :with_guesses, ->{ includes(:guess) }
加载“X”模型的所有猜测(如果存在)(运行两个查询)。没关系。效果很好。
但我需要再添加一个条件。
如果我这样做(我的第一个想法):
scope :with_guesses, ->(user) { includes(:guess).where("guesses.user_id = ?", user.id) }
它也会运行正常,但在一个查询(加入)中,这将排除没有“猜测”的结果。
有关如何使用的任何提示都包括条件,但保留没有'猜测'的结果?
更新
我最终通过使用装饰器来解决这个问题,我可以将用户作为控制器调用中的上下文传递给我,使视图保持干净。
我使用了Draper gem(https://github.com/drapergem/draper)来做到这一点。你真的不需要宝石来处理rails中的装饰器,但它可能会有所帮助。
答案 0 :(得分:1)
我没有测试它,但你可以使用像
这样的东西User.eager_load(:guesses).where("guesses.user_id = ?", user.id)
答案 1 :(得分:0)
当您使用includes和where时,包含左连接将是内连接。
所以如果你想在哪里使用左连接,你必须使用字符串sql fragment:
scope :with_guesses, ->(user) { joins('left outer join guesses on guesses.user_id = ?',
user.id)}
我没有测试上面的代码,你必须自己测试一下,这只是一种思考方式
这个问题。
这里是参考: