3

Ich habe diese Anfrage:Wie zu pflücken „wie alias_name“ von Schienen aktive Datensatz Abfrage

Client.select("name as dname") 

das ist gut funktioniert.

Client.select("name as dname").first.dname 
=> "Google" 

Jetzt möchte ich alle dnames als Array erhalten, aber zupfen Methode nicht funktioniert als dname nicht Spaltenname ist.

2.2.5 :040 > Client.select("name as dname").pluck(:dname) 
    (0.6ms) SELECT dname FROM "clients" 
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "dname" does not exist 

Wie bekomme ich Array von dnames? Gibt es eine Methode wie pluck, die auf Spaltennamen Alias ​​funktioniert, die mit als definiert ist.

kann ich dies tun durch jeden Datensatz mir keinen Sinn nicht machen

Client.select("name as dname").map{|d| d.dname} 

Aber Looping

+1

versuchen, diese 'Client.select ("namen als dname") Karte {| d. | d.dname} ' –

+0

@SantoshSharma Ich weiß, dass dies möglich ist, aber Schleifen ist nicht die beste Lösung, da wir bereits eine Liste von DNS-Namen aus der Datenbank bekommen. Warum müssen wir jedes Ergebnis erneut durchlaufen? – dnsh

Antwort

3

Nun falsch war mein Verständnis von zupfen. von apidock Ich habe verstanden, dass

Verwenden Sie pluck als eine Verknüpfung, um ein oder mehrere Attribute auszuwählen, ohne eine Reihe von Datensätzen zu laden, nur um die gewünschten Attribute zu greifen.

So

Client.select("name as dname").pluck(:dname) 

sollte wie folgt

Client.pluck("name as dname") 
2

Verwenden Sie diesen Code:

Client.select("name as dname").map{|d| d.dname} 
0

select und pluck spielen nicht gut zusammen geschrieben werden, aber ich habe eine Abhilfe verwenden, die die aliased Spalte tritt auf das Abfrageobjekt, das Zupfen erlaubt. Ich in der Regel schreiben verbindet wie diese als Bereiche, beginnend mit with_

class Client 
    scope :with_dname , -> { 
    # Build a subquery SQL snippet 
    # Since we will be joining it onto the base table, we need to select the id column as well 
    subquery = select("name AS dname, #{table_name}.id").to_sql 

    # join the subquery to base model 
    joins("JOIN (#{subquery}) as addendum ON addendum.id = #{table_name}.id") 
    } 
end 

# this will work 
Client.with_dname.first.pluck(:dname) #=> ["Google"] 

# this may be more efficient 
Client.limit(1).with_dname.first.pluck(:dname) #=> ["Google"] 
Verwandte Themen