Rails将连接的列与外键null相乘

时间:2016-10-24 06:26:31

标签: ruby-on-rails

我有这些表格:

STOCKDIARY

- ID, DATE, PRODUCT, UNITS, PRICE

PRODUCTS

- ID, NAME, CONSIGNOR

CONSIGNORS

- ID, NAME, COMMISSION

我已经设置了所有关联。因此,如果在我看来我使用:

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作为佣金。

如何解决?

3 个答案:

答案 0 :(得分:2)

<强>方法一:

将试用列添加到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

它的作用是,如果有发货人,如果你提到的话它会接受它。

答案 1 :(得分:2)

如前所述:

  

请注意,我使用Clock clock = new Clock(); clock.CurrentTime += Clock_CurrentTime; clock.Start(); private static void Clock_CurrentTime(object sender, TimeEventArgs e) { Console.WriteLine(e.Time.ToShortTimeString()); } ,因为并非所有产品都有发货人。

所以你需要:

try

答案 2 :(得分:2)

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