تنفيذ ActivereCord قبل _find
-
03-07-2019 - |
سؤال
أقوم ببناء بحث مع الكلمات الرئيسية مخزنة مؤقتًا في جدول. قبل البحث عن الكلمة الرئيسية التي تم استغلالها في الجدول ، يتم تطبيعها. على سبيل المثال ، تتم إزالة بعض علامات الترقيم مثل "-" ويتم توحيد الغلاف. ثم يتم استخدام الكلمة الرئيسية الطبيعية للعثور على جلب نتائج البحث.
أنا أتعامل حاليًا مع التطبيع في وحدة التحكم باستخدام riper_filter. كنت أتساءل عما إذا كانت هناك طريقة للقيام بذلك في النموذج بدلاً من ذلك. شيء من الناحية المفاهيمية مثل رد الاتصال "قبل_find" سيعمل على الرغم من أن ذلك لن يكون له معنى لمستوى مثيل.
المحلول
يجب أن تستخدم النطاقات المسماة:
class Whatever < ActiveRecord::Base
named_scope :search, lambda {|*keywords|
{:conditions => {:keyword => normalize_keywords(keywords)}}}
def self.normalize_keywords(keywords)
# Work your magic here
end
end
سيتيح لك استخدام النطاقات المسماة التسلسل مع نطاقات أخرى ، وهو في الحقيقة الطريق للذهاب باستخدام Rails 3.
نصائح أخرى
ربما لا ترغب في تنفيذ هذا عن طريق تجاوز الاكتشاف. من المحتمل أن يكون التغلب على شيء مثل Find بمثابة صداع أسفل الخط.
يمكنك إنشاء طريقة فئة تفعل ما تحتاجه ، شيء مثل:
class MyTable < ActiveRecord::Base
def self.find_using_dirty_keywords(*args)
#Cleanup input
#Call to actual find
end
end
اذا أنت حقًا تريد أن تجد الحمل الزائد يمكنك القيام بذلك بهذه الطريقة:
كمثال:
class MyTable < ActiveRecord::Base
def self.find(*args)
#work your magic here
super(args,you,want,to,pass)
end
end
لمزيد من المعلومات حول التصنيف الفرعي الخروج هذا الرابط: نصائح الياقوت
يشبه إلى حد كبير ما سبق ، يمكنك أيضًا استخدام alias_method_chain
.
class YourModel < ActiveRecord::Base
class << self
def find_with_condition_cleansing(*args)
#modify your args
find_without_condition_cleansing(*args)
end
alias_method_chain :find, :condition_cleansing
end
end