2016-10-24 3 views
1

と列に加わりました。だから私の見解では私が使用する場合:Railsは、乗算、私はこれらのテーブルを持っている外部キーはnull

stockdiary.product.consignor.try(:COMMISSION) 

私はストックディアリーラインで各製品の右の手数料を得る。

私はtryを使用していますが、すべての製品に荷送人がないことに注意してください。

しかし、今、私はそうstockdiary.PRICE * stockdiary.product.consignor.COMMISSION

を表示する必要がStockdiaryモデルでは、私は

def total_commission 
    (self.PRICE * self.product.consignor.COMMISSION) 
end 

を設定するしかし、これは私にエラー与える: undefined method 'COMMISSION' for nil:NilClass

を私は問題があるという事実から来ていると思いますいくつかの製品はCONSIGNOR列に空の値を持っています。ちょうど私がテーブルCONSIGNORS列COMMISSIONの各行の値を入力したことを確認する。しかし、エラーはまだそこにあります。

私は委託者のない商品で在庫ディーラー列を手数料として0を表示したいと思います。

修正方法?

答えて

2

方法1:

consignor代わりのCOMMISSIONしようと列を与えるか、またはその両方のために与えます。

def total_commission 
    (self.PRICE * self.try(:product).try(:consignor).try(:COMMISSION)) 
end 

方法2:荷主があればまた

あなたが使用することができ、それがあるん何

def total_commission 
    consignor = self.product.consignor.present? ? self.product.consignor.COMMISSION : 0 
    (self.PRICE * consignor) 
end 

、それはあなたが述べたように、それは0をとる他にそれを取ります。

+0

@catmal、第二のアプローチを試し、その以上のレールの方法が – Sravan

+0

第2のアプローチは、(場所を返します# 69853755169400)、Fixnumを取得しました(#47292841845800) – Catmal

+0

答えを更新してください今すぐチェックしてください – Sravan

2

あなたが前に言ったように:だからあなたが必要

Note that I use try because not all products have a consignor.

def total_commission 
    commission = self.product&.consignor&.COMMISSION 
    if self.PRICE && commission 
    (self.PRICE * commission) 
    else 
     nil 
    end 
end 
+0

これも同様です。ありがとう! – Catmal

2
def total_commission 
    commission = product.consignor.try(:COMMISSION) 
    commission ? (PRICE * commission) : 0 
end 
+0

これはうまくいったが、私は(self.PRICE ...に変更する必要があった。 – Catmal

+0

ありがとう!私は他のソリューションを試してみる – Catmal

+0

属性を読み取っているだけなら 'self'を使う必要はないと思う。 –

関連する問題