Rails 4 Has_Many使用Finder_SQL已弃用

时间:2016-11-14 15:53:24

标签: ruby-on-rails-4

我正在将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" }

任何想法都将不胜感激。谢谢!

1 个答案:

答案 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)