2013-08-05 191 views
0

我试图重构和优化我的代码。特别是,我想减少进入数据库的查询量。在我的用户控制器中,它工作得很好,但在其他控制器中,我尝试了相同的控制器,但没有。我已经搜索了一段时间,为什么它不起作用的答案,但我不能真正回答它。Rails命名范围

我有用户,可以通过注册订阅课程。他们通过has_many:通过等关系连接。以下作品:

@users_courses = current_user.courses 
@courses = @users_courses.a_named_scope 

但在我的课程控制器以下不会工作:

@all_courses = Course.all 
@specific_course = @all_courses.specific_course_scope 

的范围在相应的模型定义和正常工作。它们并不复杂,只是“哪里......真/假”的定义。有人在这里知道这个问题吗?谢谢!

我使用轨道版本3.2和红宝石版本2

+1

你用什么版本的Rails的? –

+0

我使用Rails版本3.2和红宝石2.对不起,我忘了。 – Linus

回答

2

直到轨道4,如果你想拥有ActiveRecord::Relation实例(您可以调用其他范围),你应该使用scoped方法返回的Array代替:

@all_courses = Course.scoped 
@specific_course = @all_courses.specific_course_scoped 

这应该工作。

如果你想使用includes(:courses),你就去做,例如使用:

@specific_course = @all_courses.specific_course_scoped.includes(:courses) 
+0

非常感谢!请问如果我使用rails 4会有什么不同?还有一个问题,是否可以将它与包含(:courses)声明结合起来? – Linus

+1

@LinusAn在Rails 4中'all'返回'ActiveRecord :: Relation'和'scoped'方法已被弃用。所以你的代码会很好。 我编辑了我的答案来回答你的第二个问题。 –

+0

非常感谢! – Linus