2014-01-23 72 views
0

我有一个在Rails 4项目中设置像这样的几个模型。有条件似乎去评估

student.rb

class Student < ActiveRecord::Base 
    has_many :contracts 

    def balance 
    unpaid_contracts.sum(&:sum_total) 
    end 

private 

    def unpaid_contracts 
    unpaid_contracts = [] 
    contracts.each do |c| 
     unpaid_contracts << c if c.unpaid? # This is the problem 
    end 
    end 

end 

contract.rb

class Contract < ActiveRecord::Base 

    has_many :invoices, dependent: :destroy 
    belongs_to :student 

    def unpaid? 
    return true if invoices.blank? 
    invoices.each do |i| 
     return true if i.current_status != "paid" && i.current_status != "rescinded" 
    end 
    end 
end 

无论我做什么所有的合同被添加到unpaid_contracts。在db中根本没有发票,所以我会假设unpaid?应该总是评估为真,对不对?

事实上,即使我将条件更改为unpaid_contracts << c if false问题仍然存在。

+0

您是否尝试过加载合同并使用'.unpaid?'它返回什么? – meagar

回答

1

注意你的返回值:

def unpaid_contracts 
    unpaid_contracts = [] 
    contracts.each do |c| 
     unpaid_contracts << c if c.unpaid? # This is the problem 
    end 
    end 

你返回contracts.each,这是说所有合同,不unpaid_contracts

这将修复它...

def unpaid_contracts 
    unpaid_contracts = [] 
    contracts.each do |c| 
     unpaid_contracts << c if c.unpaid? # This is the problem 
    end 
    unpaid_contracts 
    end 

但是,这是更好的:

def unpaid_contracts 
    contracts.select(&:unpaid?) 
    end 
1

你可以试试下面的

  1. 私有方法只有你当不打算使用Class或Class的一个实例,所以试着把它拿出来。

  2. 编码它的稍微更合适的方法:

    def unpaid_contracts 
        contracts.select { |contract| contract.invoices.count == 0} 
    end 
    
  3. 正如@meagar提到的,你是不是返回正确的变量。

+0

这段代码似乎对我很有用,就像'contracts.select {| contract | contract.pending? }' 感谢您的私人方法! – niftygrifty

+0

不客气! –