我正在将Rails应用升级到4.0。我收到以下弃用警告。我有谷歌这个,但没有找到任何告诉如何改变它。
DEPRECATION WARNING: The :finder_sql association option is deprecated. Please find an alternative (such as using scopes)...
以下是导致警告的范围:
has_many :elective_instructors,
:class_name => "Instructor",
:finder_sql => proc { "SELECT DISTINCT people.* FROM people
INNER JOIN class_sections ON class_sections.instructor_id = people.id
INNER JOIN courses ON courses.id = class_sections.course_id
INNER JOIN taken_classes ON class_sections.id = taken_classes.class_section_id
WHERE
courses.core = FALSE
AND
taken_classes.student_id = #{id}
AND
people.type = 'Instructor'
AND
people.ignore = FALSE" }
任何想法都将不胜感激。谢谢!
答案 0 :(得分:2)
自4.1起,:finder_sql
不仅被弃用 - 它已经completely REMOVED from Rails。
这是通过使用范围来做类似事情的一种方法。假设我们有一个User类和Job类(因此用户可以拥有许多作业)。让我们说我们想要找到这个用户所拥有的所有不同的工作(设计示例,但它说明了这一点),并且假设我们想要使用自定义SQL。我们可以使用find_by_sql如下
class Job < ActiveRecord::Base
scope :distinct_user_jobs, -> (user_id){ find_by_sql(["SELECT DISTINCT jobs.* FROM jobs WHERE jobs.user_id=?", user_id]) }
end
然后传递user_id
user = User.first
Job.distinct_user_jobs(user.id)