سؤال

أقوم ببناء بحث مع الكلمات الرئيسية مخزنة مؤقتًا في جدول. قبل البحث عن الكلمة الرئيسية التي تم استغلالها في الجدول ، يتم تطبيعها. على سبيل المثال ، تتم إزالة بعض علامات الترقيم مثل "-" ويتم توحيد الغلاف. ثم يتم استخدام الكلمة الرئيسية الطبيعية للعثور على جلب نتائج البحث.

أنا أتعامل حاليًا مع التطبيع في وحدة التحكم باستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top