2016-11-14 105 views
1

我正在將Rails應用升級到4.0。我收到以下棄用警告。我在Google上有這個,但還沒有找到任何說明如何改變這一點的內容。Rails 4 Has_Many With Finder_SQL已棄用

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

從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) 
+0

謝謝,但我要如何改變的has_many關係通話使用範圍有多大?將範圍鏈接到has_many行? –

+0

我不相信你可以「將範圍鏈接到has_many」。事實上,如果你仔細看看我的例子 - 範圍在MANY模型上,而不是相反。在你的情況下,範圍將不得不在教師模型上設置。 – Kalman