2016-10-21 1 views
0

Ich versuche, Werte aus vorhandenen Tabellenspalte zu berechnen und auf eine externe Variable zu verwenden.Rails Active Record zur arithmetischen Berechnung über eine Select-Anweisung

Lassen Sie meine Tabellenspalten wie sein: ["id","unit_price","quantity","extras_1","extras_2"] Ich präsentiere, was ich in Schienen mit SQL-Befehl als Referenz tun möchten.

SQL-Befehl:

SELECT unit_price*quantity AS "regular_price", 
     unit_price*quantity-unit_price*quantity*discount AS "price_after_discount" 
FROM order_details; 

In Rails Active Record-Abfrage Ich habe versucht, gleich wie:

OrderDetail.select('unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount') 

Aus der obigen query.i versucht basierend auf abgeleiteten attributes.it perfectly.But arbeitete Sortierung i Die abgeleiteten Attributwerte können nicht durch Abfragen angezeigt werden.

Der Ausgang ich habe ist, ohne dass die abgeleiteten Attribute wie:

[#<OrderDetail >,#<OrderDetail >] 

Aber ich brauche Ausgabe als:

[#<OrderDetail regular_price: 43, price_after_discount: 54>,#<OrderDetail regular_price: 54, price_after_discount: 76>] 

ich unter Abfrage versucht, die data.It zu sortieren die Daten sortiert perfekt:

OrderDetail.select('unit_price,quantity,unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount').order('regular_price desc') 

kann ich die Werte zugreifen unter Befehl:

über Command arbeitete, weil extras_1 und extras_2 Tabellenspalten sind.

Aber es funktioniert, wenn vorhandene Tabelle Spalte zugewiesen.Ich brauche abgeleitetes Attribut, um nicht vorhandene Tabelle Spaltenname sein.

Wie kann ich auf abgeleitete Attribute Werte aus einem Datensatz zugreifen.Ich kann auf sie zugreifen, indem Sie sie zu einer vorhandenen Tabelle Spalte.Aber ich möchte den Namen der Attribute gegeben, wie ich will unabhängig von Tabellenspalten.

Antwort

1

Sie können abgeleitete (Alias-) Attribute nicht sehen. Aber sie sind anwesend.

OrderDetail.select('unit_price*quantity AS regular_price,unit_price*quantity-unit_price*quantity*discount AS price_after_discount').first.regular_price 

Wird regular_price drucken.

Was Sie in Schienen Konsole sehen, ist die Ausgabe von inspect Methode. inspect Methode ist nicht implementiert, um Alias-Attribute anzuzeigen. Daher entsteht die Verwirrung.

gehen durch diese doc: http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/select

Wenn ein Alias ​​angegeben wurde, wird es aus den resultierenden Objekte zugänglich sein:

Model.select('field AS field_one').first.field_one 
#=> "value" 
1

Ihre Attribute perfekt zugänglich sind. Ruf sie einfach an!:)

Als zusätzliche Bemerkung, die ich würde vorschlagen, Sie eine modernere Art und Weise zu verwenden, um die Abfrage des Schreibens:

class OrderDetail 
    scope :with_calculated_prices, -> do 
    regular_price = (arel_table[:unit_price] * arel_table[:quantity]) 
    price_after_discount = (regular_price - regular_price * arel_table[:discount]) 
    select(regular_price.as('regular_price'), price_after_discount.as('price_after_discount'))} 
end 

price_after_discount besser als

definiert ist
price_after_discount = (regular_price * (1 - arel_table[:discount]))