[英]How to make use of ruby procs to dynamically execute a database query
我有一個名為Bucket的模型,該模型具有此實例方法Bucket#populate_students_academicwise(mentor)
def populate_students_academicwise(mentor)
student_ids = Mark.find(:all,
:joins => self.student_current_klass,
:conditions => ["marks.subject_id = ? AND st.klass_id = ? AND marks.klass_id = ? AND u.account_enabled IS TRUE AND sub.active IS TRUE AND k.active IS TRUE", mentor.subject_id, mentor.klass_id, mentor.klass_id],
:group => "marks.student_id",
:having => ["ROUND(AVG(marks_obtained)/AVG(marks_total)*100) BETWEEN ? AND ?", min_range, max_range]).collect(&:student_id)
self.assign_students(student_ids)
end
現在,此查詢返回一組學生的學業成績介於一系列值之間
ROUND(AVG(marks_obtained)/AVG(marks_total)*100) BETWEEN ? AND ?)
我從像這樣的bucket
實例中調用此方法bucket.populate_students_academicwise(mentor)
我想否定該查詢,也就是說,返回一組學習成績不在一定范圍內的學生。 我所能想到的就是創建另一個對上述查詢運行否定的方法。 所以我有另一種方法Bucket#negate_populate_students_academicwise(mentor)
def negate_populate_students_academicwise(mentor)
Mark.find(:all,
:joins => self.student_current_klass,
:conditions => ["marks.subject_id = ? AND st.klass_id = ? AND marks.klass_id = ? AND u.account_enabled IS TRUE AND sub.active IS TRUE AND k.active IS TRUE", mentor.subject_id, mentor.klass_id, mentor.klass_id],
:group => "marks.student_id",
:having => ["ROUND(AVG(marks_obtained)/AVG(marks_total)*100) NOT BETWEEN ? AND ?", min_range, max_range]).collect(&:student_id)
end
現在,此查詢返回一組學習成績ROUND(AVG(marks_obtained)/AVG(marks_total)*100) NOT BETWEEN ? AND ?
范圍值ROUND(AVG(marks_obtained)/AVG(marks_total)*100) NOT BETWEEN ? AND ?
之間的學生ROUND(AVG(marks_obtained)/AVG(marks_total)*100) NOT BETWEEN ? AND ?
ROUND(AVG(marks_obtained)/AVG(marks_total)*100) NOT BETWEEN ? AND ?
我該如何調用第一個方法Bucket#populate_students_academicwise(mentor)
並在其上附加一個否定方法bucket.populate_students_academicwise(mentor).negate
,該方法將調用proc來否定查詢?
因此,您想基本上同時具有這兩種功能,並且仍然以DRY方式擁有它們?
我會說您應該使用默認參數。
bucket.populate_students_academicwise(mentor) # dont negate
bucket.populate_students_academicwise(mentor,false) # negate
你內在的方法
def populate_students_academicwise(mentor,in_range = true)
student_ids = Mark.find(:all,
:joins => self.student_current_klass,
:conditions => ["marks.subject_id = ? AND st.klass_id = ? AND marks.klass_id = ? AND u.account_enabled IS TRUE AND sub.active IS TRUE AND k.active IS TRUE", mentor.subject_id, mentor.klass_id, mentor.klass_id],
:group => "marks.student_id",
:having => ["ROUND(AVG(marks_obtained)/AVG(marks_total)*100) #{'NOT' if !in_range} BETWEEN ? AND ?", min_range, max_range]).collect(&:student_id)
self.assign_students(student_ids)
end
通過少量的查詢操作,您可以根據參數獲得NOT(或沒有NOT),而無需擔心proc。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.