2010-05-29 5 views
15

Ich möchte eine named scope schreiben, um einen Datensatz von seiner ID zu erhalten.Wie kann ich machen, dass named_scope in Rails einen Wert anstelle eines Arrays zurückgibt?

Zum Beispiel habe ich ein Modell namens Event, und ich möchte Event.find(id) mit der Verwendung von named_scope für zukünftige Flexibilität zu simulieren.

habe ich diesen Code in meinem Modell:

named_scope :from_id, lambda { |id| {:conditions => ['id= ?', id] } } 

und nenne ich es von meinem Controller wie Event.from_id(id). Aber mein Problem ist, dass es ein Array von Event Objekten anstelle von nur einem Objekt zurückgibt.

Also wenn ich Ereignisnamen zu bekommen, habe ich

event = Event.from_id(id) 
event[0].name 

zu schreiben, während, was ich will ist

event = Event.from_id(id) 
event.name 

Bin ich etwas falsch hier?

Antwort

10

Wie Damien erwähnt, ist es nicht ratsam, ein benutzerdefiniertes Oszilloskop zu verwenden, um nach ID zu suchen. Aber um Ihre Frage zu beantworten:

Das Suchen von Datensätzen mit named_scope gibt immer ein Objekt ActiveRecord::NamedScope::Scope zurück, das sich wie ein Array verhält. Wenn es nur einen einzelnen Datensatz, indem Sie Ihre Abfrage zurückgegeben wird, können Sie die first Methode verwenden, um die Active Objekt direkt zu erhalten, wie folgt aus:

event = Event.from_id(id).first 
event.name # will work as you expect 
+0

Hallo Jimmy Danke für die schnelle Antwort.Warum ich einen benannten Bereich haben möchte ist (wie ich in Damiens Kommentar erwähnt habe) weil ich später vielleicht nur die aktiven Events bekommen möchte Also kann ich nur den genannten Bereich ändern ohne den bestehenden Code zu durchbrechen (zB nur aktiv hinzufügen = 1) Bitte lassen Sie mich Ihre Kommentare cheers, sameera wissen – sameera207

5

Sie müssen hier keinen Bereich verwenden. Sie könnten einfach Event.find_by_id id tun.
Der Unterschied zwischen find und find_by_id ist, dass der erste eine ActiveRecordNotFoundException auslösen wird, wenn der Datensatz nicht existiert. Der zweite wird nur Null zurückgeben.

Einen Bereich zu schreiben, um den Datensatz von seiner ID zu bekommen, ist eine sehr schlechte ID, da es etwas ist, das nativ bereits von Rails bereitgestellt wird.

+0

Hallo Damien, danke für die schnelle Antwort. Warum möchte ich dies als benannten Bereich haben, weil später möchte ich nur die aktiven Ereignisse So kann ich nur den genannten Bereich ohne die bestehende Code zu brechen (wie nur Hinzufügen von Active = 1) Bitte lassen Sie mich Ihre Kommentare wissen Prost, sameera – sameera207

+1

@sameera Sie könnten nur eine generische Methode hinzufügen ('def ... Ende'); Es muss kein benannter Bereich sein. –

10

In diesem Fall habe ich Methode eine Klasse erstellen würde

def self.from_id(id) 
    self.find(id).first 
end 

Ein weiteres Beispiel:

class Invoice 
    def self.number 
    self.find(:first, 
     :select => "max(number) As last, max(number)+1 As next", 
     :conditions => "type = 'SalesOrder'") 
    end 
end 

Methoden wie diese ist es besser, dann named_scope. Sie können Invoice.number.next anrufen, besser als named_scope zurück Invoice.number[0].next.

Verwandte Themen