Rails急切加载,包含和会话属性

时间:2011-08-11 12:05:55

标签: ruby-on-rails eager-loading

我有一个包含任务,用户和智慧的模型。 机智属于任务和用户。

我想加载所有任务的列表,并为特定用户急切加载机智。 我需要做一个LEFT OUTER JOIN并为连接添加一个条件。 以下是现在正在运作的内容:

Mission.joins("LEFT OUTER JOIN wits ON wits.mission_id = missions.id AND wits.user_id = #{current_user.id}")

然后在我的列表中,我可以执行mission.wits.first以获取属于正确用户的机智。

但它不是非常友好,我必须检查.loaded?属性,以避免在不满足条件时加载所有智慧。

是否有更好的方法,希望使用范围来完成工作?也许为Mission添加一个新的虚拟属性,但我想避免在每个列表上对数据库进行20次调用。

更新:最后我想查看一个任务列表,并为每个任务查看current_user的Wit状态。我正在使用一个名为acts_as_api的gem来创建JSON中的列表视图,但我无法访问模型中的会话变量,这就是为什么我正在看这个急切的加载东西,加载我需要的所有东西来自控制器。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

这应该适合你:

Mission.joins(:wits).where(:wits => { :user_id => params[:user_id] }) Or
Mission.joins(:wits).where('wits.user_id' => params[:user_id] )

答案 1 :(得分:0)

为什么不做类似

的事情
Wit.includes(:mission).where(:user_id => params[:user_id])

当你觉得自己真的只想要那些智慧时,你有没有理由向群里询问?此外,如果你想要一个相关任务列表,你也可以做这样的事情

Wit.includes(:mission).where(:user_id => params[:user_id]).select(&:mission).uniq