2010-10-16 4 views
21

ich einen Raum Modell habe, und ich will diesenRails finden oder erstellen basierend auf zwei Felder

Venue.find_or_create_by_ 

tun, aber ich möchte nur ein neuer Ort erstellt werden, wenn man mit dem gleichen Namen und das Datum nicht bereits existieren

zum Beispiel

=> Venue(id: integer, location: string, showdate: datetime, created_at: datetime, updated_at: datetime) 

Ein Ort ist einzigartig und geschaffen werden muss, wenn die Lage und die showdate in der DB nicht vorhanden sind

Antwort

41

Sie können die Spalten mithilfe von _and_ miteinander verketten. Dies sollte den Trick:

Venue.find_or_create_by_location_and_showdate(location, showdate) 
+0

Jeez, Rails und besonders Ruby erstaunt mich immer wieder. Woher weiß es, was diese Funktion bedeutet? Gibt es irgendeine Art von Catch alle find_or_create_by_ * Funktion, die es interpretiert? – Jordan

+7

Eigentlich vergiss ich nur die Rails-Quelle - Rails verwendet eine method_missing-Funktion, die eine Regex auf die aufgerufene Methode durchführt und diese zerlegt. Es ist Genie. Wenn jemand anders interessiert ist, lesen Sie active_record/base.rb in der Rails-Quelle. – Jordan

+0

Auch akzeptabel ist es, sie als Argumente zu übergeben. Venue.find_or_create_by (: location => location,: showdate => showdate) –

1
my_class = ClassName.find_or_initialize_by_showdate_and_location(showdate,location) 
my_class.update_attributes! 

find_or_initialize-Methode suchen nach Name und Speicherort in der Datenbank. Wenn der Datensatz nicht existiert, initialisiert er einen neuen Datensatz mit Showdate und Ort. http://api.rubyonrails.org/classes/ActiveRecord/Base.html Dieser Link hilft Ihnen herauszufinden, find_or_initialize und find_or_create.

+0

Der Aufruf von '.update_attributes!' Ohne irgendwelche Attribute zu übergeben ist ziemlich nutzlos. '.save!' wäre eine viel bessere Option. Und in diesem Fall hat der Anforderer bereits gesagt, dass er ".find_or_create" verwenden möchte, sodass Sie den Datensatz nicht in zwei separaten Schritten initialisieren und speichern müssen. – vonconrad

+0

@vonconrad Ich habe bereits einen Link zur Verfügung gestellt, der eine Vorstellung über beide Methoden gibt. Welcher Benutzer möchte es verwenden? Ich gab eine Idee, beide Methoden sind verfügbar. –

+1

Mit find_or_initialize wird das Problem gelöst, dass versucht wird, einen Datensatz zu erstellen, wenn Validierungen vorhanden sind, die von einem create nicht erfüllt werden. z.B. Daten von einem anderen System migrieren. – Gary

7

In Schienen 4 würden Sie tun:

Venue.find_or_create_by(location: location, showdate: showdate) 

viel schöner, wenn Sie mich fragen!

Verwandte Themen