Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 on rails Ruby用保护替换if块_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby用保护替换if块

Ruby on rails Ruby用保护替换if块,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个服务对象,它根据指定的数据创建CSV文件。调用方法非常简单: def initialize(data) @data = data end def call CSV.generate(headers: true, col_sep: ';') do |csv| csv << csv_headers data.uniq.each do |contract| next if contract.transient

我有一个服务对象,它根据指定的数据创建CSV文件。调用方法非常简单:

  def initialize(data)
    @data = data
  end

  def call
    CSV.generate(headers: true, col_sep: ';') do |csv|
      csv << csv_headers

      data.uniq.each do |contract|
        next if contract.transient

        payment_details = [
          next_payment_date(contract),
          I18n.t("contracts.interval_options.#{contract.recurring_transaction_interval&.name}"),
        ]
        csv << payment_details
      end
    end
  end

  private

  def next_payment_date(contract)
    if contract.upcoming_installment.nil?
      I18n.t('tables.headers.no_next_payment_date')
    else
      contract.upcoming_installment.transaction_date.to_s
    end
  end

在我看来,这种方法看起来还不错。提高可读性是增加LOC或引入方法的有利权衡。也就是说,如果你真的喜欢,有很多方法可以让它成为一行

contract.upcoming_installment&.transaction_date || I18n.t('tables.headers.no_next_payment_date')

Ruby的安全导航
&.
将返回nil,如果
即将发行的部分
为nil,则应返回到
I18n

您所称的“guard”实际上是一个三元条件,Rubucop是对的,因为代码对三元条件的渴望太多了。这里需要
&.transaction\u date
实际上是因为违反了Demeter法。这实际上应该通过在契约上定义一个方法来重构。
contract.upcoming_installment&.transaction_date || I18n.t('tables.headers.no_next_payment_date')