2012-05-07 17 views
1

私はTutorのモデルにacts_as_taggable_on gemを使用しました。各チューターには、クラス(C201、M101)、科目(化学、数学など)、背景(芸術、科学)のような複数種類の談話があります。Railsでオーダーのタグを検索

生徒はその順序で教師と一致したいと思う。例:

正確にクラスが一致する10人のチューターがいる場合は、停止します。

正確なクラスマッチのチューターが5人しかいない場合は、件名マッチで次の5人を探します。

Subjectが正確に一致する2人のチューターのみが一致した場合、次の3つはバックグラウンドで一致します。

スコープまたはSQLクエリを効率的に作成するにはどうすればよいですか?これを行うための素朴な方法は、各生徒のために、私はすべての教師の関連性を計算し、それに応じてランク付けする必要があります。しかし、これはあまりにも非効率的です。

+0

モデル間の関係は何ですか? –

+0

SQLクエリを書き込むためのサンプルデータを表示できますか? – beck03076

+0

おかげで、Aayush。更新された質問をご覧ください。 – AdamNYC

答えて

1

ようTutors.whereようなもの(:クラス=> '値が'、被験者=> ...)。ORDER_BY(:クラス:件名、...)。限度(10)

そして、マッチの組み合わせを覚えていますか?

1

モデル:

require 'active_record' 

ActiveRecord::Base.logger = Logger.new(STDERR) 
ActiveRecord::Base.colorize_logging = false 

ActiveRecord::Base.establish_connection(
    :adapter => 'sqlite3', 
    :dbfile => ':memory:' 
) 

ActiveRecord::Schema.define do 

    create_table :College do |table| 
     table.column :name, :string 
    end 

end 

class College < ActiveRecord::Base 
    acts_as_taggable_on :roles, :courses, :subjects, :backgrounds 
end 

college = College.new(:name => 'Kerry Green', :role_list => 'student', :course_list => 'CM201', :subject_list => 'Biochemistry', :background_list = 'Science') 
college.save 

college = College.new(:name => 'Brian Jones', :role_list => 'student', :course_list => 'CM101', :subject_list => 'Chemistry', :background_list = 'Science') 
college.save 

college = College.new(:name => 'Lewis Smith', :role_list => 'student', :course_list => 'AR102', :subject_list => 'Fine Art', :background_list = 'Arts') 
college.save 

college = College.new(:name => 'Evan Hunt', :role_list => 'tutor', :course_list => 'CM201, CM101', :subject_list => 'Chemistry, Biochemistry', :background_list = 'Science') 
college.save 

college = College.new(:name => 'Stuart White', :role_list => 'tutor', :course_list => 'CM201', :subject_list => 'Biochemistry', :background_list = 'Science') 
college.save 

college = College.new(:name => 'Wendy Jones', :role_list => 'tutor', :course_list => 'CM201', :subject_list => 'Biochemistry', :background_list = 'Science') 
college.save 

タグマッチング:

# find CM201 courses 

@student = College.find(:name => 'Brian Jones') 

@byCourse = @student.find_related_on_courses.find_tagged_with('tutor', :on=> :roles) 
if @byCourse.length >= 10 
    // rule 1 
else 
    @bySubject = @student.find_related_on_subjects.find_tagged_with('tutor', :on=> :roles) 
    if @byCourse.length >= 5 && @bySubject.length >= 5 
    // rule 2 
    else 
    @byBackground = @student.find_related_on_backgrounds.find_tagged_with('tutor', :on=> :roles) 
    if @bySubject.length >= 2 && @byBackground.length >= 3 
     // rule 3 
    else 
     // no match 
    end 
    end 
end