2011-01-09 11 views
1

Ich habe einige Zeit damit verbracht, dies herauszufinden und habe noch nicht gesehen, dass andere darauf gepostet haben, also wird das vielleicht jemandem helfen. Außerdem habe ich nicht viel Erfahrung mit Rails, daher wäre ich dankbar für Korrekturen oder Vorschläge, auch wenn der folgende Code gut zu funktionieren scheint.Verwenden des benannten Bereichs mit find_or_create_by

Ich habe ein virtuelles Attribut eingerichtet, um full_name aus first_name und last_name wie in Railscast on virtual attributes beschrieben zu machen. Ich wollte auch nach full_name suchen, also fügte ich ein named_scope hinzu, wie in Jim's answer here vorgeschlagen.

named_scope :find_by_full_name, lambda {|full_name| 
    {:conditions => {:first => full_name.split(' ').first, 
    :last => full_name.split(' ').last}} 
} 

ABER ... Ich wollte so in der Lage sein, dies alles zu verwenden: find_or_create_by_full_name. Das Erstellen eines benannten Bereichs mit diesem Namen stellt nur die Suche bereit (identisch mit dem obigen Code: find_by_full_name) - d. H., Er tut nicht, was ich möchte. Also, um das zu handhaben ich eine Klassenmethode für meine User-Klasse erstellt genannt: find_or_create_by_full_name

# This gives us find_or_create_by functionality for the full_name virtual attribute. 
# I put this in my user.rb class. 
def self.find_or_create_by_full_name(name) 
    if found = self.find_by_full_name(name).first # Because we're using named scope we get back an array 
    return found 
    else 
    created = self.find_by_full_name(name).create 
    return created 
    end 
end 

Antwort

1

Sie könnten genausogut verwenden User.find_or_create_by_first_name_and_last_name(:first_name => "firstname", :last_name => "last_name")