2016-11-14 12 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です。

ここでは、スコープを使用して同様のことを行う方法の1つです。 UserクラスとJobクラスがあるとします(ユーザーが多くのジョブを持つことができるように)。そして、このユーザーが保持している別個のすべてのジョブ(意図した例を示しています)を見つけ出し、カスタム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 

を次のようにfind_by_sqlを使用し、user_id

user = User.first 
Job.distinct_user_jobs(user.id) 
+0

おかげで渡すが、どのように私は、スコープを使用するようにhas_manyの関係コールを変更することができますか?スコープをhas_many行に連結しますか? –

+0

私はあなたがちょうど "範囲をhas_manyにチェーンする"ことはできないと信じています。実のところ、私の例を注意深く見れば、スコープはMANYモデルであり、それ以外の方法ではありません。あなたの場合、スコープはInstructorモデルで設定する必要があります。 – Kalman