2010-12-30 31 views
1

ich dies in Rails 2.3.10 und 3.0.3 und es funktioniertActive finden außer Kraft setzen

def self.find(*args) 
    records = super 
    # Manipulate Records here. 
end 

für eine Basis-Finder-Funktion Suche in Rails getan haben 3, die ich für diese Funktionalität ersetzen kann angewendet werden zu Post.All, Post.first, Post.last usw.

+8

Es ist fast nie eine gute Idee, Kernfunktionalität wie folgt zu ändern. Es ist überraschend auf eine schlechte Art und Weise. Können Sie etwas über das sagen, was Sie erreichen möchten? Es gibt wahrscheinlich eine viel sauberere und wartungsfreundlichere Lösung. –

Antwort

4

Mein Rat ... machen einen Rahmen oder eine Klassenmethode diese stattdessen zu tun:

z.B.

scope :my_scope, lambda {|...| ...} 

dann

TheClass.my_scope.all 
TheClass.my_scope.first 
TheClass.my_scope.last 
1

all, first und last sind nur Wrapper für find so find Neudefinition alle diejenigen beeinflussen sollte. Sehen Sie sich an, wie sie in ActiveRecord::FinderMethods implementiert werden.

+0

Das Überschreiben der Suche funktioniert gut, aber aus irgendeinem Grund scheint es nicht mit allen, ersten oder letzten zu arbeiten. Ich werde es noch einmal versuchen. – Rahul

1

Ich glaube, Sie suchen dafür:

# File activerecord/lib/active_record/relation/finder_methods.rb, line 95 
def find(*args) 
    return to_a.find { |*block_args| yield(*block_args) } if block_given? 

    options = args.extract_options! 

    if options.present? 
    apply_finder_options(options).find(*args) 
    else 
    case args.first 
    when :first, :last, :all 
     send(args.first) 
    else 
     find_with_ids(*args) 
    end 
    end 
end 
1

anzuwenden fragte Dies wird tun, was die ursprüngliche Frage.

def self.find_by_sql(*args) 
    records = super 

    # Manipulate Records here 

    return records 
end 
Verwandte Themen