我有一个包含任务,用户和智慧的模型。 机智属于任务和用户。
我想加载所有任务的列表,并为特定用户急切加载机智。 我需要做一个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中的列表视图,但我无法访问模型中的会话变量,这就是为什么我正在看这个急切的加载东西,加载我需要的所有东西来自控制器。
感谢您的帮助
答案 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