【问题标题】:Rails named scopesRails 命名范围
【发布时间】:2013-08-06 09:30:14
【问题描述】:

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

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

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

但在我的课程控制器中,以下内容不起作用:

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

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

我使用的是 rails 3.2 版和 ruby​​ 2 版。

【问题讨论】:

  • 你使用什么版本的 Rails?
  • 我使用 Rails 3.2 版和 ruby​​ 2。对不起,我忘记了。

标签: ruby-on-rails model controller scope


【解决方案1】:

在 Rails 4 之前,如果您希望返回 ActiveRecord::Relation 实例(您可以在其上调用其他范围)而不是 Array,则应该使用 scoped 方法:

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

这应该可行。

如果你想使用includes(:courses),你只需这样做,例如:

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

【讨论】:

  • 非常感谢!请问如果我使用rails 4会有什么不同?还有一个问题,是否可以将其与 include(:courses) 语句结合起来?
  • @LinusAn 在 Rails 4 all 返回 ActiveRecord::Relationscoped 方法已弃用。所以你的代码会很好。我编辑了我的答案来回答你的第二个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2011-09-23
相关资源
最近更新 更多