2016-10-21 27 views
0

既存のテーブル列から値を計算し、外部変数に使用しようとしています。Rails Activeステートメントを使用して算術演算を行うレコード

私のテーブルの列を次のようにしてください:["id","unit_price","quantity","extras_1","extras_2"] 私はリファレンスとしてSQLコマンドを使用して、レールで何をしたいのかを提示しています。

SQLコマンド:RailsのActive Recordのクエリで

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

私は同じ試みた:上記query.iから

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

が導き出さattributes.itに基づいて並べ替えてみましたperfectly.But私が働いていましたクエリによって派生した属性値を参照することはできません。

私が得た出力として導出属性なしです:

[#<OrderDetail >,#<OrderDetail >] 

しかし、私のように出力を必要とする:私はdata.Itをソートするために、クエリの下にしようとした

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

は完全にデータを並べ替え:

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') 

私は、コマンドの下に使用して値にアクセスできます。

OrderDetail.select('unit_price,quantity,unit_price*quantity AS extras_1,unit_price*quantity-unit_price*quantity*discount AS extras_2') 

上記のコマンドは、extras_1extras_2が表の列なので、作業しました。

しかし、既存のテーブルの列に割り当てられているときに機能しています。派生した属性には、存在しないテーブルの列名が必要です。

レコードから派生した属性値にアクセスするにはどうすればよいですか。既存のテーブルの列に割り当てることでアクセスできます。ただし、テーブルの列に関係なく、どのように属性名を指定しますか?

答えて

1

派生(エイリアス)属性を表示することはできません。しかし、彼らは存在します。

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

regular_priceを印刷します。

rails consoleに表示される内容は、inspectメソッドの出力です。 inspectメソッドは、エイリアス属性を表示するために実装されていません。したがって、混乱が生じる。このdocて

ゴー:http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/select

エイリアスが指定された場合、それが結果として オブジェクトからアクセスできるようになります:

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

あなたの属性が完全にアクセス可能です。ちょうどそれらを呼び出してください!:)私は、クエリの書き込みで、より近代的な方法を使用することをお勧めしたい追加の発言として

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が良い

price_after_discount = (regular_price * (1 - arel_table[:discount])) 
として定義されているが
関連する問題