从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
...
答案 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
查询接口的一部分,之后的所有内容都是关联的选项。