添加条件确实包括activerecord

时间:2014-05-02 19:27:02

标签: ruby-on-rails activerecord decorator

首先我有这个:

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中的装饰器,但它可能会有所帮助。

2 个答案:

答案 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)} 

我没有测试上面的代码,你必须自己测试一下,这只是一种思考方式

这个问题。

这里是参考:

http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations