从3升级到4时的Rails范围

时间:2014-07-14 22:50:15

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 scope

从Rails 3升级到Rail 4时,我得到了一个"无效的范围块混合和ActiveRecord关联的弃用查找器选项"错误。关于这个问题有几个帖子,其中一些使用的格式如下:

has_many :readable_exams,
         -> { where trashed_at: nil },
         through: :student

但是,当我使用此格式时,我收到了无效错误。另一方面,当我这样做时:

has_many :readable_exams,
         -> { where(trashed_at: nil)
              .through(:student) }

没有错误被抛出。任何人都可以解释为什么通过在第一种情况下抛出错误,但不是第二种情况?

修改 事实证明我的错误来自于包含我之前忽略的has_many的with_options块。

with_options source: :exams,
             primary_key: "student_id",
             group: "exams.id" do |user| # This was throwing the error
    user.has_many :readable_exams,
                  -> { where trashed_at: nil },
                  through: :student
    ...

1 个答案:

答案 0 :(得分:1)

through选项不是在范围块中调用的函数。你需要说:

has_many :exams, -> { where(trashed_at: nil) }, through: :student

关联现在采用可选的第二个参数,即块,它可以为关联指定某些约束(因此范围块)。您可以在指南中找到哪些方法有效:http://guides.rubyonrails.org/association_basics.html第4.3.3节介绍了has_many关联的有效方法。

要记住的一件事是,范围块中调用的所有方法都是ActiveRecord查询接口的一部分,之后的所有内容都是关联的选项。