Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 有条件的似乎没有得到评估_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby 有条件的似乎没有得到评估

Ruby 有条件的似乎没有得到评估,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,在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| u

在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
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
class-Student未支付的合同请注意您的回报值:

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

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

你能试试下面的吗

  • 私有方法仅适用于不打算使用类或类的实例的情况,因此请尝试将其删除

  • 略为简洁的编码方式:

    def unpaid_contracts
       contracts.select { |contract| contract.invoices.count == 0}
    end
    
  • 正如@meagar所提到的,您没有返回正确的变量


  • 您是否尝试过加载一个合同并使用
    .unpaid?
    它会返回什么?该代码对我来说似乎是这样的
    contracts.select{| contract | contract.pending?}
    感谢您对私有方法的指导!
    def unpaid_contracts
       contracts.select { |contract| contract.invoices.count == 0}
    end